home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / gfx / fract / FlashMandelWOS.lha / FlashMandel / Developer / FlashMandel.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-10  |  152.9 KB  |  4,688 lines

  1. /*******************************************************************************
  2. **
  3. **  Coded by Dino Papararo        LAST MODIFIED 4-August-2002
  4. **
  5. **  Modified for reaction-, locale- and arexx-support by Edgar Schwan  23-Jan-2002
  6. **
  7. *******************************************************************************/
  8.  
  9. //#define STORMAMIGA
  10. //#define STORMAMIGA_OS3
  11.  
  12. //#include <stormamiga.h>
  13. //#include <stdio.h>
  14. #include <string.h>
  15. #include <math.h>
  16. #include <exec/exec.h>
  17. #include <powerpc/powerpc.h>
  18. #include <powerpc/memoryPPC.h>
  19. //#include <clib/alib_protos.h>
  20. //#include <clib/powerpc_protos.h>
  21. #include <intuition/intuition.h>
  22. #include <intuition/gadgetclass.h>
  23. #include <graphics/gfxbase.h>
  24. #include <graphics/scale.h>
  25. #include <devices/printer.h>
  26. #include <workbench/workbench.h>
  27. #include <classes/arexx.h>  /* new for ARexx-support */
  28. #include <rexx/rxslib.h>    /**/
  29. #include <rexx/errors.h>    /**/
  30. #include <iffp/ilbmapp.h>
  31.  
  32. #ifndef __STORMGCC__
  33. #include <clib/exec_protos.h>
  34. #include <clib/dos_protos.h>
  35. #include <clib/diskfont_protos.h>
  36. #include <clib/gadtools_protos.h>
  37. #include <clib/utility_protos.h>
  38. #include <clib/iffparse_protos.h>
  39. #include <clib/icon_protos.h>
  40. #include <clib/asl_protos.h>
  41. #include <clib/wb_protos.h>
  42. #include <clib/locale_protos.h>
  43. #include <clib/powerpc_protos.h>
  44. #include <clib/rexxsyslib_protos.h> /* new for ARexx-support */
  45. #include <pragmas/exec_pragmas.h>
  46. #include <pragmas/dos_pragmas.h>
  47. #include <pragmas/diskfont_pragmas.h>
  48. #include <pragmas/gadtools_pragmas.h>
  49. #include <pragmas/utility_pragmas.h>
  50. #include <pragmas/iffparse_pragmas.h>
  51. #include <pragmas/icon_pragmas.h>
  52. #include <pragmas/asl_pragmas.h>
  53. #include <pragmas/wb_pragmas.h>
  54. #include <pragmas/locale_pragmas.h>
  55. #include <pragma/powerpc_lib.h>
  56. #include <pragmas/rexxsyslib_pragmas.h> /* new for ARexx-support */
  57. #include <clib/intuition_protos.h>
  58. #include <clib/graphics_protos.h>
  59. #include <pragmas/intuition_pragmas.h>
  60. #include <pragmas/graphics_pragmas.h>
  61. #else /*__STORMGCC__*/
  62. #include <proto/exec.h>
  63. #include <proto/dos.h>
  64. #include <proto/diskfont.h>
  65. #include <proto/gadtools.h>
  66. #include <proto/utility.h>
  67. #include <proto/iffparse.h>
  68. #include <proto/icon.h>
  69. #include <proto/asl.h>
  70. #include <proto/wb.h>
  71. #include <proto/powerpc.h>
  72. #include <proto/rexxsyslib.h>   /* new for ARexx-support */
  73. #define __NOLIBBASE__
  74. #include <proto/intuition.h>
  75. #include <proto/graphics.h>
  76. #endif /*__STORMGCC__*/
  77.  
  78. extern struct ExecBase *SysBase;
  79.  
  80. #include "flashmandel.h"
  81.  
  82. #include "FM_ConfirmReq_React.h"
  83. #include "FM_PalettePref_React.h"
  84. #include "FM_InfoReq_React.h"
  85. #include "FM_IntegerReq_React.h"
  86. #include "FM_SysInfoReq_React.h"
  87. #include "FM_CoordReq_React.h"
  88.  
  89. #include "FM_Reaction.h"    /* new for reaction-support */
  90. #include "FM_ReactionCD.h"  /**/
  91. #include "FM_ReactionBasics.h"
  92. #include "FM_ARexx_React.h"     /* new for ARexx-support */
  93. #include "FM_ARexx_Misc.h"      /**/
  94.  
  95.  
  96.  
  97. struct Library *ResourceBase = NULL;    /* new for reaction-support */
  98.  
  99. struct Catalog *CatalogPtr = NULL;      /**/
  100.  
  101. TEXT FMSCREENNAME [MAXPUBSCREENNAME + 1] = "FlashMandel.1";  /**/
  102.  
  103. UWORD oldstatus = 0;                    /**/
  104.  
  105. ULONG receivedsig, wsignal, lastsignal, allocsignal;  /**/
  106.  
  107. BOOL res;                               /**/
  108.  
  109. struct RxsLib *RexxSysBase = NULL;
  110.  
  111. extern Object *ARexxObj;
  112.  
  113. extern ULONG arexxsignal;
  114.  
  115. extern struct List ARexxEventList;
  116.  
  117. BOOL ForceAbort = FALSE;
  118.  
  119. #ifndef __STORMGCC__
  120. struct Library *PowerPCBase = NULL;
  121. #else /*__STORMGCC__*/
  122. extern struct Library *PowerPCBase;
  123. #endif /*__STORMGCC__*/
  124.  
  125. struct MandelChunk MANDChunk = {0};
  126.  
  127. UBYTE *PixelLine;
  128.  
  129. UBYTE *GfxPpcMem;
  130.  
  131. TEXT VERSION_STRING [] = "\0$VER: " VERSION " " COPYRIGHT_DATE " by " AUTHOR " compiled in " DATE "\n\0";
  132.  
  133. TEXT CMD_Guide [] = "Run >NIL: SYS:Utilities/MultiView FlashMandel:Docs/FlashMandel.guide";
  134.  
  135. TEXT MYFILE [MAX_FILELEN],PICTURESDIR [MAX_DIRLEN],PALETTESDIR [MAX_DIRLEN],MYPATH [MAX_PATHLEN],BAR_STRING [BARLEN],USERNAME [MAX_FILELEN];
  136.  
  137. TEXT MYFONT [MAX_FILELEN];
  138.  
  139. TEXT CPU68K_STR [10],FPU68K_STR [10],CPUPPC_STR [10],FPUPPC_STR [10];
  140.  
  141. TEXT *MYDIR = NULL;
  142.  
  143. WORD MX1 = 0 , MY1 = 0 , MX2 = 0 , MY2 = 0, W = 0, H = 0;  /* changed for ARexx-support */
  144.  
  145. BOOL DEPTH_CHANGED;
  146.  
  147. WORD ZOOMLINE [PAIRS << 1], RETURNVALUE = 0;
  148.  
  149. LONG PRIORITY = DEF_STARTPRI,DELAY = 5L,__oslibversion = Lib_Version;
  150.  
  151. ULONG MASK = TMASK;
  152.  
  153. ULONG ELAPSEDTIME = NULL,COLORS,CPUINFO,UFLAGS = NULL, UITERATIONS = NULL, UPOWER = NULL,MAX_ITERATIONS = 320;
  154.  
  155. LDouble RMIN=INIT_DEF_RMIN,RMAX=INIT_DEF_RMAX,IMIN=INIT_DEF_IMIN,IMAX=INIT_DEF_IMAX;
  156.  
  157. LDouble DEF_RMIN,DEF_RMAX,DEF_IMIN,DEF_IMAX,DEF_JKRE=INIT_DEF_JKRE,DEF_JKIM=INIT_DEF_JKIM,URMIN=0.0,URMAX=0.0,UIMIN=0.0,UIMAX=0.0,UJKRE=0.0,UJKIM=0.0;
  158.  
  159. LDouble INCREMREAL=0.0,INCREMIMAG=0.0,CRE=0.0,CIM=0.0,JKRE=0.0,JKIM=0.0;
  160.  
  161. ULONG *PALETTE;
  162.  
  163. CPTR *VINFO = NULL;
  164.  
  165. UBYTE (*COLORREMAP) (const LDouble,const LDouble,const LDouble);
  166.  
  167. VOID (*V_LINE) (struct RastPort *,const WORD,const WORD,const WORD);
  168.  
  169. VOID (*H_LINE) (struct RastPort *,const WORD,const WORD,const WORD);
  170.  
  171. WORD (*M_FUNC) (ULONG,ULONG,LDouble,LDouble);
  172.  
  173. WORD (*J_FUNC) (ULONG,ULONG,LDouble,LDouble,LDouble,LDouble);
  174.  
  175. UBYTE LinearRemap    (const LDouble,const LDouble,const LDouble);
  176. UBYTE LogRemap       (const LDouble,const LDouble,const LDouble);
  177. UBYTE RepeatedRemap  (const LDouble,const LDouble,const LDouble);
  178. UBYTE SquareRootRema (const LDouble,const LDouble,const LDouble);
  179. UBYTE OneRemap       (const LDouble,const LDouble,const LDouble);
  180. UBYTE TwoRemap       (const LDouble,const LDouble,const LDouble);
  181. UBYTE ThreeRemap     (const LDouble,const LDouble,const LDouble);
  182. UBYTE FourRemap      (const LDouble,const LDouble,const LDouble);
  183.  
  184. static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *),REG (a2,struct ScreenModeRequester *),REG (a1,ULONG));
  185.  
  186. struct Hook         SMFILTERHOOK      = {NULL,NULL,(void *) SMFilterFunc,NULL};
  187.  
  188. struct Border       MYBORDER          = {0,0,0,0,COMPLEMENT,PAIRS,ZOOMLINE,0};
  189.  
  190. struct TextAttr     MYFONTSTRUCT      = {DEF_FONTNAMESTR,DEF_FONTSIZE,FS_NORMAL,FPF_DISKFONT};
  191.  
  192. struct NewGadget    TEXTGAD           = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  193.  
  194. struct NewGadget    BUTTONGAD         = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  195.  
  196. struct NewGadget    CHECKBOXGAD       = {0,0,0,0,0,&MYFONTSTRUCT,0,0,0,0};
  197.  
  198. struct BitScaleArgs BSA               = {0,0,0,0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL};
  199.  
  200. // struct Chunk COPYRIGHT_CHUNK = {NULL,ID_ILBM,ID_Copyright,sizeof (UBYTE) * strlen (VERSION "by " AUTHOR " " COPYRIGHT_DATE),VERSION "by " AUTHOR " " COPYRIGHT_DATE};
  201. struct Chunk COPYRIGHT_CHUNK = {NULL,ID_ILBM,ID_Copyright,0,VERSION "by " AUTHOR " " COPYRIGHT_DATE};
  202.  
  203. struct Chunk USERNAME_CHUNK  = {©RIGHT_CHUNK,ID_ILBM,ID_AUTH,sizeof (UBYTE) * MAX_FILELEN,USERNAME};
  204.  
  205. struct Chunk SPECIAL_CHUNK   = {NULL,ID_ILBM,ID_MAND,sizeof (struct MandelChunk),NULL};
  206.  
  207. UWORD PENS [] = {BLACK,DARK_GREY,WHITE,WHITE,DARK_GREY,LIGHT_GREY,DARK_GREY,LIGHT_GREY,DARK_GREY,WHITE,LIGHT_GREY,DARK_GREY,(UWORD) ~0};
  208.  
  209. /*
  210.  
  211. 01      0 DETAILPEN             SFONDO
  212. 02      1 BLOCKPEN              TESTO
  213. 03      1 TEXTPEN               TESTO EVIDENZIATO
  214. 04      2 SHINEPEN              BORDI CHIARI
  215. 05      1 SHADOWPEN             BORDI SCURI
  216. 06      3 FILLPEN               BARRA TITOLO FINESTRE ATTIVE
  217. 07      1 FILLTEXTPEN           TITOLO FINESTRE ATTIVE
  218. 08      0 BACKGROUNDPEN
  219. 09      2 HIGHLIGHTTEXTPEN
  220.  
  221. 10      1 BARDETAILPEN          TESTO NEI MENU
  222. 11      2 BARBLOCKPEN           SFONDO NEI MENU
  223. 12      1 BARTRIMPEN
  224.  
  225. */
  226.  
  227. ULONG COLORS_ECS [] = {32L << 16,
  228.                        0x00000000,0x00000000,0x00000000,
  229.                        0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  230.                        0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,
  231.                        0x66666666,0x66666666,0x66666666,
  232.                        0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,
  233.                        0xBBBBBBBB,0xBBBBBBBB,0xBBBBBBBB,
  234.                        0x77777777,0x77777777,0x77777777,
  235.                        0x33333333,0x33333333,0x33333333,
  236.                        0x33333333,0x33333333,0x00000000,
  237.                        0x77777777,0x77777777,0x00000000,
  238.                        0xBBBBBBBB,0xBBBBBBBB,0x00000000,
  239.                        0xFFFFFFFF,0xFFFFFFFF,0x00000000,
  240.                        0x00000000,0xFFFFFFFF,0x00000000,
  241.                        0x00000000,0xBBBBBBBB,0x00000000,
  242.                        0x00000000,0x77777777,0x00000000,
  243.                        0x00000000,0x33333333,0x00000000,
  244.                        0x33333333,0x00000000,0x33333333,
  245.                        0x77777777,0x00000000,0x77777777,
  246.                        0xBBBBBBBB,0x00000000,0xBBBBBBBB,
  247.                        0xFFFFFFFF,0x00000000,0xFFFFFFFF,
  248.                        0xFFFFFFFF,0x00000000,0x00000000,
  249.                        0xBBBBBBBB,0x00000000,0x00000000,
  250.                        0x77777777,0x00000000,0x00000000,
  251.                        0x33333333,0x00000000,0x00000000,
  252.                        0x00000000,0x33333333,0x33333333,
  253.                        0x00000000,0x77777777,0x77777777,
  254.                        0x00000000,0xBBBBBBBB,0xBBBBBBBB,
  255.                        0x00000000,0xFFFFFFFF,0xFFFFFFFF,
  256.                        0x00000000,0x00000000,0xFFFFFFFF,
  257.                        0x00000000,0x00000000,0xBBBBBBBB,
  258.                        0x00000000,0x00000000,0x77777777,
  259.                        0x00000000,0x00000000,0x33333333,
  260.                        NULL};
  261.  
  262.  
  263. ULONG COLORS_AGA []  =  {256L << 16,
  264.                          0x00000000,0x00000000,0x00000000, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA, 0x66666666,0x66666666,0x66666666,
  265.                          0x9f9f9f9f,0x9f9f9f9f,0x9f9f9f9f, 0xafafafaf,0xafafafaf,0xafafafaf, 0xbfbfbfbf,0xbfbfbfbf,0xbfbfbfbf, 0xcfcfcfcf,0xcfcfcfcf,0xcfcfcfcf,
  266.                          0xdfdfdfdf,0xdfdfdfdf,0xdfdfdfdf, 0xefefefef,0xefefefef,0xefefefef, 0xdfdfdfdf,0xefefefef,0xffffffff, 0xcfcfcfcf,0xdfdfdfdf,0xefefefef,
  267.                          0xbfbfbfbf,0xcfcfcfcf,0xdfdfdfdf, 0xafafafaf,0xbfbfbfbf,0xcfcfcfcf, 0x9f9f9f9f,0xafafafaf,0xbfbfbfbf, 0x8f8f8f8f,0x9f9f9f9f,0xafafafaf,
  268.                          0x7f7f7f7f,0x8f8f8f8f,0x9f9f9f9f, 0x6f6f6f6f,0x7f7f7f7f,0x8f8f8f8f, 0x5f5f5f5f,0x6f6f6f6f,0x7f7f7f7f, 0x4f4f4f4f,0x5f5f5f5f,0x6f6f6f6f,
  269.                          0x3f3f3f3f,0x4f4f4f4f,0x5f5f5f5f, 0x2f2f2f2f,0x3f3f3f3f,0x4f4f4f4f, 0x1f1f1f1f,0x2f2f2f2f,0x3f3f3f3f, 0x0f0f0f0f,0x1f1f1f1f,0x2f2f2f2f,
  270.                          0x00000000,0x0f0f0f0f,0x1f1f1f1f, 0x1f1f1f1f,0x0f0f0f0f,0x1f1f1f1f, 0x2f2f2f2f,0x1f1f1f1f,0x2f2f2f2f, 0x3f3f3f3f,0x2f2f2f2f,0x3f3f3f3f,
  271.                          0x4f4f4f4f,0x3f3f3f3f,0x4f4f4f4f, 0x5f5f5f5f,0x4f4f4f4f,0x5f5f5f5f, 0x6f6f6f6f,0x5f5f5f5f,0x6f6f6f6f, 0x7f7f7f7f,0x6f6f6f6f,0x7f7f7f7f,
  272.                          0x8f8f8f8f,0x7f7f7f7f,0x8f8f8f8f, 0x9f9f9f9f,0x8f8f8f8f,0x9f9f9f9f, 0xafafafaf,0x9f9f9f9f,0xafafafaf, 0xbfbfbfbf,0xafafafaf,0xbfbfbfbf,
  273.                          0xcfcfcfcf,0xbfbfbfbf,0xcfcfcfcf, 0xdfdfdfdf,0xcfcfcfcf,0xdfdfdfdf, 0xefefefef,0xdfdfdfdf,0xefefefef, 0xffffffff,0xefefefef,0xffffffff,
  274.                          0xefefefef,0xffffffff,0xefefefef, 0xdfdfdfdf,0xefefefef,0xdfdfdfdf, 0xcfcfcfcf,0xdfdfdfdf,0xcfcfcfcf, 0xbfbfbfbf,0xcfcfcfcf,0xbfbfbfbf,
  275.                          0xafafafaf,0xbfbfbfbf,0xafafafaf, 0x9f9f9f9f,0xafafafaf,0x9f9f9f9f, 0x8f8f8f8f,0x9f9f9f9f,0x8f8f8f8f, 0x7f7f7f7f,0x8f8f8f8f,0x7f7f7f7f,
  276.                          0x6f6f6f6f,0x7f7f7f7f,0x6f6f6f6f, 0x5f5f5f5f,0x6f6f6f6f,0x5f5f5f5f, 0x4f4f4f4f,0x5f5f5f5f,0x4f4f4f4f, 0x3f3f3f3f,0x4f4f4f4f,0x3f3f3f3f,
  277.                          0x2f2f2f2f,0x3f3f3f3f,0x2f2f2f2f, 0x1f1f1f1f,0x2f2f2f2f,0x1f1f1f1f, 0x0f0f0f0f,0x1f1f1f1f,0x0f0f0f0f, 0x0f0f0f0f,0x1f1f1f1f,0x1f1f1f1f,
  278.                          0x1f1f1f1f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x5f5f5f5f,0x5f5f5f5f,
  279.                          0x5f5f5f5f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x9f9f9f9f,0x9f9f9f9f,
  280.                          0x9f9f9f9f,0xafafafaf,0xafafafaf, 0xafafafaf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xdfdfdfdf,0xdfdfdfdf,
  281.                          0xdfdfdfdf,0xefefefef,0xefefefef, 0xefefefef,0xffffffff,0xffffffff, 0xffffffff,0xefefefef,0xefefefef, 0xefefefef,0xdfdfdfdf,0xdfdfdfdf,
  282.                          0xdfdfdfdf,0xcfcfcfcf,0xcfcfcfcf, 0xcfcfcfcf,0xbfbfbfbf,0xbfbfbfbf, 0xbfbfbfbf,0xafafafaf,0xafafafaf, 0xafafafaf,0x9f9f9f9f,0x9f9f9f9f,
  283.                          0x9f9f9f9f,0x8f8f8f8f,0x8f8f8f8f, 0x8f8f8f8f,0x7f7f7f7f,0x7f7f7f7f, 0x7f7f7f7f,0x6f6f6f6f,0x6f6f6f6f, 0x6f6f6f6f,0x5f5f5f5f,0x5f5f5f5f,
  284.                          0x5f5f5f5f,0x4f4f4f4f,0x4f4f4f4f, 0x4f4f4f4f,0x3f3f3f3f,0x3f3f3f3f, 0x3f3f3f3f,0x2f2f2f2f,0x2f2f2f2f, 0x2f2f2f2f,0x1f1f1f1f,0x1f1f1f1f,
  285.                          0x1f1f1f1f,0x0f0f0f0f,0x0f0f0f0f, 0x1f1f1f1f,0x1f1f1f1f,0x0f0f0f0f, 0x2f2f2f2f,0x2f2f2f2f,0x1f1f1f1f, 0x3f3f3f3f,0x3f3f3f3f,0x2f2f2f2f,
  286.                          0x4f4f4f4f,0x4f4f4f4f,0x3f3f3f3f, 0x5f5f5f5f,0x5f5f5f5f,0x4f4f4f4f, 0x6f6f6f6f,0x6f6f6f6f,0x5f5f5f5f, 0x7f7f7f7f,0x7f7f7f7f,0x6f6f6f6f,
  287.                          0x8f8f8f8f,0x8f8f8f8f,0x7f7f7f7f, 0x9f9f9f9f,0x9f9f9f9f,0x8f8f8f8f, 0xafafafaf,0xafafafaf,0x9f9f9f9f, 0xbfbfbfbf,0xbfbfbfbf,0xafafafaf,
  288.                          0xcfcfcfcf,0xcfcfcfcf,0xbfbfbfbf, 0xdfdfdfdf,0xdfdfdfdf,0xcfcfcfcf, 0xefefefef,0xefefefef,0xdfdfdfdf, 0xffffffff,0xffffffff,0xefefefef,
  289.                          0xefefefef,0xefefefef,0xffffffff, 0xdfdfdfdf,0xdfdfdfdf,0xefefefef, 0xcfcfcfcf,0xcfcfcfcf,0xdfdfdfdf, 0xbfbfbfbf,0xbfbfbfbf,0xcfcfcfcf,
  290.                          0xafafafaf,0xafafafaf,0xbfbfbfbf, 0x9f9f9f9f,0x9f9f9f9f,0xafafafaf, 0x8f8f8f8f,0x8f8f8f8f,0x9f9f9f9f, 0x7f7f7f7f,0x7f7f7f7f,0x8f8f8f8f,
  291.                          0x6f6f6f6f,0x6f6f6f6f,0x7f7f7f7f, 0x5f5f5f5f,0x5f5f5f5f,0x6f6f6f6f, 0x4f4f4f4f,0x4f4f4f4f,0x5f5f5f5f, 0x3f3f3f3f,0x3f3f3f3f,0x4f4f4f4f,
  292.                          0x2f2f2f2f,0x2f2f2f2f,0x3f3f3f3f, 0x1f1f1f1f,0x1f1f1f1f,0x2f2f2f2f, 0x0f0f0f0f,0x0f0f0f0f,0x1f1f1f1f, 0x0f0f0f0f,0x0f0f0f0f,0x00000000,
  293.                          0x1f1f1f1f,0x1f1f1f1f,0x00000000, 0x2f2f2f2f,0x2f2f2f2f,0x00000000, 0x3f3f3f3f,0x3f3f3f3f,0x00000000, 0x4f4f4f4f,0x4f4f4f4f,0x00000000,
  294.                          0x5f5f5f5f,0x5f5f5f5f,0x00000000, 0x6f6f6f6f,0x6f6f6f6f,0x00000000, 0x7f7f7f7f,0x7f7f7f7f,0x00000000, 0x8f8f8f8f,0x8f8f8f8f,0x00000000,
  295.                          0x9f9f9f9f,0x9f9f9f9f,0x00000000, 0xafafafaf,0xafafafaf,0x00000000, 0xbfbfbfbf,0xbfbfbfbf,0x00000000, 0xcfcfcfcf,0xcfcfcfcf,0x00000000,
  296.                          0xdfdfdfdf,0xdfdfdfdf,0x00000000, 0xefefefef,0xefefefef,0x00000000, 0xffffffff,0xffffffff,0x00000000, 0xefefefef,0xffffffff,0x00000000,
  297.                          0xdfdfdfdf,0xffffffff,0x00000000, 0xcfcfcfcf,0xffffffff,0x00000000, 0xbfbfbfbf,0xffffffff,0x00000000, 0xafafafaf,0xffffffff,0x00000000,
  298.                          0x9f9f9f9f,0xffffffff,0x00000000, 0x8f8f8f8f,0xffffffff,0x00000000, 0x7f7f7f7f,0xffffffff,0x00000000, 0x6f6f6f6f,0xffffffff,0x00000000,
  299.                          0x5f5f5f5f,0xffffffff,0x00000000, 0x4f4f4f4f,0xffffffff,0x00000000, 0x3f3f3f3f,0xffffffff,0x00000000, 0x2f2f2f2f,0xffffffff,0x00000000,
  300.                          0x1f1f1f1f,0xffffffff,0x00000000, 0x0f0f0f0f,0xffffffff,0x00000000, 0x00000000,0xffffffff,0x00000000, 0x00000000,0xefefefef,0x00000000,
  301.                          0x00000000,0xdfdfdfdf,0x00000000, 0x00000000,0xcfcfcfcf,0x00000000, 0x00000000,0xbfbfbfbf,0x00000000, 0x00000000,0xafafafaf,0x00000000,
  302.                          0x00000000,0x9f9f9f9f,0x00000000, 0x00000000,0x8f8f8f8f,0x00000000, 0x00000000,0x7f7f7f7f,0x00000000, 0x00000000,0x6f6f6f6f,0x00000000,
  303.                          0x00000000,0x5f5f5f5f,0x00000000, 0x00000000,0x4f4f4f4f,0x00000000, 0x00000000,0x3f3f3f3f,0x00000000, 0x00000000,0x2f2f2f2f,0x00000000,
  304.                          0x00000000,0x1f1f1f1f,0x00000000, 0x00000000,0x0f0f0f0f,0x00000000, 0x0f0f0f0f,0x00000000,0x0f0f0f0f, 0x1f1f1f1f,0x00000000,0x1f1f1f1f,
  305.                          0x2f2f2f2f,0x00000000,0x2f2f2f2f, 0x3f3f3f3f,0x00000000,0x3f3f3f3f, 0x4f4f4f4f,0x00000000,0x4f4f4f4f, 0x5f5f5f5f,0x00000000,0x5f5f5f5f,
  306.                          0x6f6f6f6f,0x00000000,0x6f6f6f6f, 0x7f7f7f7f,0x00000000,0x7f7f7f7f, 0x8f8f8f8f,0x00000000,0x8f8f8f8f, 0x9f9f9f9f,0x00000000,0x9f9f9f9f,
  307.                          0xafafafaf,0x00000000,0xafafafaf, 0xbfbfbfbf,0x00000000,0xbfbfbfbf, 0xcfcfcfcf,0x00000000,0xcfcfcfcf, 0xdfdfdfdf,0x00000000,0xdfdfdfdf,
  308.                          0xefefefef,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xffffffff, 0xffffffff,0x00000000,0xefefefef, 0xffffffff,0x00000000,0xdfdfdfdf,
  309.                          0xffffffff,0x00000000,0xcfcfcfcf, 0xffffffff,0x00000000,0xbfbfbfbf, 0xffffffff,0x00000000,0xafafafaf, 0xffffffff,0x00000000,0x9f9f9f9f,
  310.                          0xffffffff,0x00000000,0x8f8f8f8f, 0xffffffff,0x00000000,0x7f7f7f7f, 0xffffffff,0x00000000,0x6f6f6f6f, 0xffffffff,0x00000000,0x5f5f5f5f,
  311.                          0xffffffff,0x00000000,0x4f4f4f4f, 0xffffffff,0x00000000,0x3f3f3f3f, 0xffffffff,0x00000000,0x2f2f2f2f, 0xffffffff,0x00000000,0x1f1f1f1f,
  312.                          0xffffffff,0x00000000,0x0f0f0f0f, 0xffffffff,0x00000000,0x00000000, 0xefefefef,0x00000000,0x00000000, 0xdfdfdfdf,0x00000000,0x00000000,
  313.                          0xcfcfcfcf,0x00000000,0x00000000, 0xbfbfbfbf,0x00000000,0x00000000, 0xafafafaf,0x00000000,0x00000000, 0x9f9f9f9f,0x00000000,0x00000000,
  314.                          0x8f8f8f8f,0x00000000,0x00000000, 0x7f7f7f7f,0x00000000,0x00000000, 0x6f6f6f6f,0x00000000,0x00000000, 0x5f5f5f5f,0x00000000,0x00000000,
  315.                          0x4f4f4f4f,0x00000000,0x00000000, 0x3f3f3f3f,0x00000000,0x00000000, 0x2f2f2f2f,0x00000000,0x00000000, 0x1f1f1f1f,0x00000000,0x00000000,
  316.                          0x0f0f0f0f,0x00000000,0x00000000, 0x00000000,0x0f0f0f0f,0x0f0f0f0f, 0x00000000,0x1f1f1f1f,0x1f1f1f1f, 0x00000000,0x2f2f2f2f,0x2f2f2f2f,
  317.                          0x00000000,0x3f3f3f3f,0x3f3f3f3f, 0x00000000,0x4f4f4f4f,0x4f4f4f4f, 0x00000000,0x5f5f5f5f,0x5f5f5f5f, 0x00000000,0x6f6f6f6f,0x6f6f6f6f,
  318.                          0x00000000,0x7f7f7f7f,0x7f7f7f7f, 0x00000000,0x8f8f8f8f,0x8f8f8f8f, 0x00000000,0x9f9f9f9f,0x9f9f9f9f, 0x00000000,0xafafafaf,0xafafafaf,
  319.                          0x00000000,0xbfbfbfbf,0xbfbfbfbf, 0x00000000,0xcfcfcfcf,0xcfcfcfcf, 0x00000000,0xdfdfdfdf,0xdfdfdfdf, 0x00000000,0xefefefef,0xefefefef,
  320.                          0x00000000,0xffffffff,0xffffffff, 0x00000000,0xefefefef,0xffffffff, 0x00000000,0xdfdfdfdf,0xffffffff, 0x00000000,0xcfcfcfcf,0xffffffff,
  321.                          0x00000000,0xbfbfbfbf,0xffffffff, 0x00000000,0xafafafaf,0xffffffff, 0x00000000,0x9f9f9f9f,0xffffffff, 0x00000000,0x8f8f8f8f,0xffffffff,
  322.                          0x00000000,0x7f7f7f7f,0xffffffff, 0x00000000,0x6f6f6f6f,0xffffffff, 0x00000000,0x5f5f5f5f,0xffffffff, 0x00000000,0x4f4f4f4f,0xffffffff,
  323.                          0x00000000,0x3f3f3f3f,0xffffffff, 0x00000000,0x2f2f2f2f,0xffffffff, 0x00000000,0x1f1f1f1f,0xffffffff, 0x00000000,0x0f0f0f0f,0xffffffff,
  324.                          0x00000000,0x00000000,0xffffffff, 0x00000000,0x00000000,0xefefefef, 0x00000000,0x00000000,0xdfdfdfdf, 0x00000000,0x00000000,0xcfcfcfcf,
  325.                          0x00000000,0x00000000,0xbfbfbfbf, 0x00000000,0x00000000,0xafafafaf, 0x00000000,0x00000000,0x9f9f9f9f, 0x00000000,0x00000000,0x8f8f8f8f,
  326.                          0x00000000,0x00000000,0x7f7f7f7f, 0x00000000,0x00000000,0x6f6f6f6f, 0x00000000,0x00000000,0x5f5f5f5f, 0x00000000,0x00000000,0x4f4f4f4f,
  327.                          0x00000000,0x00000000,0x3f3f3f3f, 0x00000000,0x00000000,0x2f2f2f2f, 0x00000000,0x00000000,0x1f1f1f1f, 0x00000000,0x00000000,0x0f0f0f0f,
  328.                          NULL};
  329.  
  330. CHIP UWORD ZoomPointer [] = {0x0000,0x0000,0x0100,0x0000,0x0100,0x0000,0x0000,0x0100,
  331.                              0x0000,0x0100,0x0100,0x0100,0x0100,0x0100,0x0000,0x0000,
  332.                              0xCC66,0x3C78,0x0000,0x0000,0x0100,0x0100,0x0100,0x0100,
  333.                              0x0000,0x0100,0x0000,0x0100,0x0100,0x0000,0x0100,0x0000,
  334.                              0x0000,0x0000};
  335.  
  336. struct NewMenu ProgMenu[] = { NM_TITLE,NULL,0,0,0, (APTR) TXT_Project,
  337.  
  338.                               NM_ITEM,NULL,"A",NM_ITEMDISABLED,0, (APTR) TXT_About,
  339.  
  340.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  341.  
  342.                               NM_ITEM,NULL,"N",NM_ITEMDISABLED,0, (APTR) TXT_SystemInfo,
  343.  
  344.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  345.  
  346.                               NM_ITEM,NULL,"H",NM_ITEMDISABLED,0, (APTR) TXT_Help,
  347.  
  348.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  349.  
  350.                               NM_ITEM,NULL,"L",NM_ITEMDISABLED,0, (APTR) TXT_LoadPicture,
  351.  
  352.                               NM_ITEM,NULL,"S",NM_ITEMDISABLED,0, (APTR) TXT_SavePicture,
  353.  
  354.                               NM_ITEM,NULL,"Y",NM_ITEMDISABLED,0, (APTR) TXT_LoadPalette,
  355.  
  356.                               NM_ITEM,NULL,"E",NM_ITEMDISABLED,0, (APTR) TXT_SavePalette,
  357.  
  358.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  359.  
  360.                               NM_ITEM,NULL,"D",NM_ITEMDISABLED,0, (APTR) TXT_Print,
  361.  
  362.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  363.  
  364.                               NM_ITEM,NULL,"Q",NM_ITEMDISABLED,0, (APTR) TXT_Quit,
  365.  
  366. /***************************************************************************************/
  367.  
  368.                               NM_TITLE,NULL,0,0,0, (APTR) TXT_Options,
  369.  
  370.                               NM_ITEM,NULL,0,NM_ITEMDISABLED,0, (APTR) TXT_Title,
  371.                               NM_SUB,NULL,"O",CHECKIT|MENUTOGGLE|CHECKED,0, (APTR) TXT_TitleBar,
  372.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  373.                               NM_SUB,NULL,"T",0,0, (APTR) TXT_LastTime,
  374.  
  375.                               NM_ITEM,NULL,"C",NM_ITEMDISABLED,0, (APTR) TXT_Limits,
  376.  
  377.                               NM_ITEM,NULL,0,NM_ITEMDISABLED,0, (APTR) TXT_Iterations,
  378.                               NM_SUB,"256",0,CHECKIT,~(1<<0),0,
  379.                               NM_SUB,"320",0,CHECKIT|CHECKED,~(1<<1),0,
  380.                               NM_SUB,"512",0,CHECKIT,~(1<<2),0,
  381.                               NM_SUB,"1024",0,CHECKIT,~(1<<3),0,
  382.                               NM_SUB,"2048",0,CHECKIT,~(1<<4),0,
  383.                               NM_SUB,"4096",0,CHECKIT,~(1<<5),0,
  384.                               NM_SUB,"8192",0,CHECKIT,~(1<<6),0,
  385.                               NM_SUB,"16384",0,CHECKIT,~(1<<7),0,
  386.                               NM_SUB,"32767",0,CHECKIT,~(1<<8),0,
  387.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  388.                               NM_SUB,NULL,"I",CHECKIT,~(1<<10), (APTR) TXT_Custom,
  389.  
  390.                               NM_ITEM,NULL,0,NM_ITEMDISABLED,0, (APTR) TXT_ZPower,
  391.                               NM_SUB,"2°",0,CHECKIT,~(1<<0),0,
  392.                               NM_SUB,"4°",0,CHECKIT,~(1<<1),0,
  393.                               NM_SUB,"8°",0,CHECKIT,~(1<<2),0,
  394.                               NM_SUB,"16°",0,CHECKIT,~(1<<3),0,
  395.                               NM_SUB,"32°",0,CHECKIT,~(1<<4),0,
  396.                               NM_SUB,"64°",0,CHECKIT,~(1<<5),0,
  397.                               NM_SUB,"128°",0,CHECKIT,~(1<<6),0,
  398.                               NM_SUB,"256°",0,CHECKIT,~(1<<7),0,
  399.                               NM_SUB,"512°",0,CHECKIT,~(1<<8),0,
  400.                               NM_SUB,"1024°",0,CHECKIT,~(1<<9),0,
  401.                               NM_SUB,"2048°",0,CHECKIT,~(1<<10),0,
  402.  
  403.                               NM_ITEM,NULL,0,0,0, (APTR) TXT_Priority,
  404.                               NM_SUB,"-5","%",CHECKIT,~(1<<0),0,
  405.                               NM_SUB,"-4","$",CHECKIT,~(1<<1),0,
  406.                               NM_SUB,"-3","£",CHECKIT,~(1<<2),0,
  407.                               NM_SUB,"-2","\"",CHECKIT,~(1<<3),0,
  408.                               NM_SUB,"-1","!",CHECKIT,~(1<<4),0,
  409.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  410.                               NM_SUB," 0","0",CHECKIT,~(1<<6),0,
  411.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  412.                               NM_SUB,"+1","1",CHECKIT,~(1<<8),0,
  413.                               NM_SUB,"+2","2",CHECKIT,~(1<<9),0,
  414.                               NM_SUB,"+3","3",CHECKIT,~(1<<10),0,
  415.                               NM_SUB,"+4","4",CHECKIT,~(1<<11),0,
  416.                               NM_SUB,"+5","5",CHECKIT,~(1<<12),0,
  417.  
  418.                               NM_ITEM,NULL,0,0,0, (APTR) TXT_ColorRemap,
  419.                               NM_SUB,NULL,"6",CHECKIT,~(1<<0), (APTR) TXT_Linear,
  420.                               NM_SUB,"Ln (x)","7",CHECKIT,~(1<<1),0,
  421.                               NM_SUB,NULL,"8",CHECKIT,~(1<<2), (APTR) TXT_Repeated,
  422.                               NM_SUB,"Sqrt (x)","9",CHECKIT,~(1<<3),0,
  423.                               NM_SUB,"x²-x","&",CHECKIT,~(1<<4),0,
  424.                               NM_SUB,"Sqrt (x³-x²-x)","/",CHECKIT,~(1<<5),0,
  425.                               NM_SUB,"Sinh (Ln (x³))","(",CHECKIT,~(1<<6),0,
  426.                               NM_SUB,"Cosh (Log (x³))",")",CHECKIT,~(1<<7),0,
  427.  
  428.                               NM_ITEM,NULL,0,0,0, (APTR) TXT_FractalType,
  429.                               NM_SUB,NULL,"J",CHECKIT,~(1<<0), (APTR) TXT_Julia,
  430.                               NM_SUB,NULL,"M",CHECKIT,~(1<<1), (APTR) TXT_Mandelbrot,
  431.  
  432.                               NM_ITEM,NULL,0,0,0, (APTR) TXT_Processor,
  433.                               NM_SUB,"68k","-",CHECKIT,~(1<<0),0,
  434.                               NM_SUB,"Ppc","+",CHECKIT,~(1<<1),0,
  435.  
  436. /***************************************************************************************/
  437.  
  438.                               NM_TITLE,NULL,0,0,0, (APTR) TXT_Calculate,
  439.  
  440.                               NM_ITEM,NULL,"W",NM_ITEMDISABLED,0, (APTR) TXT_Preview,
  441.  
  442.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  443.  
  444.                               NM_ITEM,NULL,"R",NM_ITEMDISABLED,0, (APTR) TXT_Recalculate,
  445.  
  446.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  447.  
  448.                               NM_ITEM,NULL,"U",NM_ITEMDISABLED,0, (APTR) TXT_Undo,
  449.  
  450.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  451.  
  452.                               NM_ITEM,NULL,"Z",NM_ITEMDISABLED,0, (APTR) TXT_Zoom,
  453.  
  454.                               NM_ITEM,NULL,"X",0,0, (APTR) TXT_Stop,
  455.  
  456. /***************************************************************************************/
  457.  
  458.                               NM_TITLE,NULL,0,0,0, (APTR) TXT_Video,
  459.  
  460.                               NM_ITEM,NULL,0,NM_ITEMDISABLED,0, (APTR) TXT_Cycle,
  461.                               NM_SUB,NULL,">",0,0, (APTR) TXT_Forward,
  462.                               NM_SUB,NULL,"<",0,0, (APTR) TXT_Backward,
  463.                               NM_SUB,NM_BARLABEL,0,0,0,0,
  464.                               NM_SUB,NULL,".",0,0, (APTR) TXT_Delay,
  465.  
  466.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  467.  
  468.                               NM_ITEM,NULL,"P",NM_ITEMDISABLED,0, (APTR) TXT_Palette,
  469.  
  470.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  471.  
  472.                               NM_ITEM,NULL,"V",NM_ITEMDISABLED,0, (APTR) TXT_ScreenMode,
  473.  
  474.                               NM_ITEM,NM_BARLABEL,0,0,0,0,
  475.  
  476.                               NM_ITEM,NULL,"F",NM_ITEMDISABLED,0, (APTR) TXT_FontSettings,
  477.  
  478. /***************************************************************************************/
  479.  
  480. //                              NM_TITLE,"ARexx",0,0,0,0,
  481.  
  482. //                              NM_ITEM,"Launch...",0,0,0,0,
  483.  
  484.                               NM_END,0,0,0,0,0 };
  485.  
  486.  
  487. struct Menu *MAINMENU = NULL;
  488.  
  489. struct BitMap *MYBITMAP = NULL;
  490.  
  491. struct Task *THISTASK = NULL;
  492.  
  493. struct TextFont *NEWFONT = NULL;
  494.  
  495. struct ILBMInfo MYILBM = {0};
  496.  
  497. LONG IlbmProps[] = { ID_ILBM, ID_BMHD, ID_ILBM, ID_CMAP, ID_ILBM, ID_CAMG, ID_ILBM, ID_MAND, ID_ILBM, ID_AUTH, ID_ILBM, ID_Copyright, TAG_DONE };
  498.  
  499. LONG IlbmCollects[] = { TAG_DONE };
  500.  
  501. LONG IlbmStops[] = { ID_ILBM, ID_BODY, TAG_DONE };
  502.  
  503. void wbmain (struct WBStartup *ArgMsg)
  504. {
  505. LONG ReturnCode;
  506.  
  507. CONST_STRPTR *IconToolTypes;
  508.  
  509. BPTR OldDir = NULL;
  510.  
  511. struct WBArg *Wb_Arg = NULL;
  512.  
  513. struct DiskObject *ActDiskObject = NULL;
  514.  
  515. #ifndef __STORMGCC__
  516.  PowerPCBase = OpenLibrary (POWERPCNAME,14);
  517. #endif /*__STORMGCC__*/
  518.  
  519.  Wb_Arg = ArgMsg->sm_ArgList;         /* Get first WB-Message */
  520.  
  521.  if (ArgMsg->sm_NumArgs)
  522.  {
  523.     if (Wb_Arg->wa_Lock)
  524.     {
  525.        OldDir = CurrentDir (Wb_Arg->wa_Lock);
  526.  
  527.        if (ActDiskObject = GetDiskObject (Wb_Arg->wa_Name))
  528.        {
  529.           IconToolTypes = (CONST_STRPTR *) ActDiskObject->do_ToolTypes;
  530.  
  531.           MYILBM.Bmhd.w = ArgInt (IconToolTypes,"SCREENWIDTH",DEF_WIDTH);
  532.           MYILBM.Bmhd.h = ArgInt (IconToolTypes,"SCREENHEIGHT",DEF_HEIGHT);
  533.           MYILBM.Bmhd.nPlanes = ArgInt (IconToolTypes,"SCREENDEPTH",MAX_DEPTH);
  534.  
  535.           sscanf (ArgString (IconToolTypes,"SCREENMODE",DEF_MONITORSTR),"%lx",&MYILBM.camg);
  536.  
  537.           RMIN = strtod (ArgString (IconToolTypes,"REALMIN",INIT_DEF_RMINSTR),NULL);
  538.           RMAX = strtod (ArgString (IconToolTypes,"REALMAX",INIT_DEF_RMAXSTR),NULL);
  539.           IMIN = strtod (ArgString (IconToolTypes,"IMAGMIN",INIT_DEF_IMINSTR),NULL);
  540.           IMAX = strtod (ArgString (IconToolTypes,"IMAGMAX",INIT_DEF_IMAXSTR),NULL);
  541.  
  542.           if (ArgInt (IconToolTypes,"USEPPC",FALSE)) MANDChunk.Flags |= PPC_BIT;
  543.  
  544.           else MANDChunk.Flags |= MC68K_BIT;
  545.  
  546.           if (ArgInt (IconToolTypes,"STARTWITHJULIA",FALSE)) MANDChunk.Flags |= JULIA_BIT;
  547.  
  548.           else MANDChunk.Flags |= MANDEL_BIT;
  549.  
  550.           switch (ArgInt (IconToolTypes,"POWER",FALSE))
  551.           {
  552.              case 1: MANDChunk.Power = 0;
  553.  
  554.                      break;
  555.  
  556.              case 2: MANDChunk.Power = 1;
  557.  
  558.                      break;
  559.  
  560.              case 3: MANDChunk.Power = 2;
  561.  
  562.                      break;
  563.  
  564.              case 4: MANDChunk.Power = 3;
  565.  
  566.                      break;
  567.  
  568.              case 5: MANDChunk.Power = 4;
  569.  
  570.                      break;
  571.  
  572.              case 6: MANDChunk.Power = 5;
  573.  
  574.                      break;
  575.  
  576.              case 7: MANDChunk.Power = 6;
  577.  
  578.                      break;
  579.  
  580.              case 8: MANDChunk.Power = 7;
  581.  
  582.                      break;
  583.  
  584.              case 9: MANDChunk.Power = 8;
  585.  
  586.                      break;
  587.  
  588.             case 10: MANDChunk.Power = 9;
  589.  
  590.                      break;
  591.  
  592.             case 11: MANDChunk.Power = 10;
  593.  
  594.                      break;
  595.  
  596.             default: MANDChunk.Power = 0;
  597.  
  598.                      break;
  599.           }
  600.  
  601.           switch (ArgInt (IconToolTypes,"COLORSREMAP",FALSE))
  602.           {
  603.              case 0: MANDChunk.Flags |= LINEAR_BIT;
  604.  
  605.                      break;
  606.  
  607.              case 1: MANDChunk.Flags |= LOG_BIT;
  608.  
  609.                      break;
  610.  
  611.              case 2: MANDChunk.Flags |= REPEATED_BIT;
  612.  
  613.                      break;
  614.  
  615.              case 3: MANDChunk.Flags |= SQUARE_BIT;
  616.  
  617.                      break;
  618.  
  619.              case 4: MANDChunk.Flags |= ONE_BIT;
  620.  
  621.                      break;
  622.  
  623.              case 5: MANDChunk.Flags |= TWO_BIT;
  624.  
  625.                      break;
  626.  
  627.              case 6: MANDChunk.Flags |= THREE_BIT;
  628.  
  629.                      break;
  630.  
  631.              case 7: MANDChunk.Flags |= FOUR_BIT;
  632.  
  633.                      break;
  634.  
  635.             default: MANDChunk.Flags |= LINEAR_BIT;
  636.  
  637.                      break;
  638.           }
  639.  
  640.           JKRE = strtod (ArgString (IconToolTypes,"JULIACONSTREAL",INIT_DEF_JKRESTR),NULL);
  641.           JKIM = strtod (ArgString (IconToolTypes,"JULIACONSTIMAG",INIT_DEF_JKIMSTR),NULL);
  642.  
  643.           strncpy (USERNAME,ArgString (IconToolTypes,"USERNAME",DEF_USERNAMESTR),MAX_FILELEN);
  644.  
  645.           MYFONTSTRUCT.ta_Name = strncpy (MYFONT,ArgString (IconToolTypes,"FONTNAME",DEF_FONTNAMESTR),MAX_FILELEN);
  646.  
  647.           MYFONTSTRUCT.ta_YSize = ArgInt (IconToolTypes,"FONTSIZE",DEF_FONTSIZE);
  648.  
  649.           PRIORITY = ArgInt (IconToolTypes,"STARTPRI",DEF_STARTPRI);
  650.  
  651.           FreeDiskObject (ActDiskObject);
  652.  
  653.           MYILBM.Bmhd.w = MIN (MAX_WIDTH,MAX (MYILBM.Bmhd.w,DEF_WIDTH));
  654.  
  655.           MYILBM.Bmhd.h = MIN (MAX_HEIGHT,MAX (MYILBM.Bmhd.h,DEF_HEIGHT));
  656.  
  657.           MYILBM.Bmhd.nPlanes = MIN (MAX_DEPTH,MAX (MYILBM.Bmhd.nPlanes,MIN_DEPTH));
  658.  
  659.           MYFONTSTRUCT.ta_YSize = MIN (MAX_FONTSIZE,MAX (MYFONTSTRUCT.ta_YSize,MIN_FONTSIZE));
  660.  
  661.           PRIORITY = MIN (5,MAX (PRIORITY,-5));
  662.  
  663.           MYFONTSTRUCT.ta_Flags |= FPF_DESIGNED;  /* new for reaction-support */
  664.  
  665.           ReturnCode = MainProg ();
  666.        }
  667.  
  668.        CurrentDir (OldDir);
  669.     }
  670.  
  671.     else goto defaults;
  672.   }
  673.  
  674.   else goto defaults;
  675.  
  676. #ifndef __STORMGCC__
  677.   if (PowerPCBase) CloseLibrary (PowerPCBase);
  678. #endif /*__STORMGCC__*/
  679.  
  680.   exit (ReturnCode);
  681.  
  682. defaults:
  683.  
  684.   MYILBM.camg = DEF_MONITOR;
  685.  
  686.   MYILBM.Bmhd.w = DEF_WIDTH;
  687.  
  688.   MYILBM.Bmhd.h = DEF_HEIGHT;
  689.  
  690.   MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH);
  691.  
  692.   MANDChunk.Flags |= (PPC_BIT|LINEAR_BIT|MANDEL_BIT|REAL_BIT);
  693.  
  694.   MANDChunk.Power = 0;
  695.  
  696.   strcpy (USERNAME,DEF_USERNAMESTR);
  697.  
  698.   ReturnCode = MainProg ();
  699.  
  700. #ifndef __STORMGCC__
  701.   if (PowerPCBase) CloseLibrary (PowerPCBase);
  702. #endif /*__STORMGCC__*/
  703.  
  704.   exit (ReturnCode);
  705. }
  706.  
  707. LONG main (LONG Argc,CONST_STRPTR *Argv)
  708. {
  709. LONG ReturnCode;
  710.  
  711. #ifndef __STORMGCC__
  712.   PowerPCBase = OpenLibrary (POWERPCNAME,14);
  713. #endif /*__STORMGCC__*/
  714.  
  715.   MYILBM.camg = DEF_MONITOR;
  716.  
  717.   MYILBM.Bmhd.w = DEF_WIDTH;
  718.  
  719.   MYILBM.Bmhd.h = DEF_HEIGHT;
  720.  
  721.   MYILBM.Bmhd.nPlanes = (CheckGFX () ? MAX_DEPTH : DEF_DEPTH);
  722.  
  723.   MANDChunk.Flags |= (PPC_BIT|LINEAR_BIT|MANDEL_BIT|REAL_BIT);
  724.  
  725.   strcpy (USERNAME,DEF_USERNAMESTR);
  726.  
  727.   ReturnCode = MainProg ();
  728.  
  729. #ifndef __STORMGCC__
  730.   if (PowerPCBase) CloseLibrary (PowerPCBase);
  731. #endif /*__STORMGCC__*/
  732.  
  733.   return ReturnCode;
  734. }
  735.  
  736. LONG MainProg (VOID)
  737. {
  738.  
  739. COPYRIGHT_CHUNK.ch_Size = strlen((const char *) COPYRIGHT_CHUNK.ch_Data);   /* new for StormGCC-support */
  740.  
  741.      if ((allocsignal = AllocSignal(-1)) == -1) return (10);  /* new for reaction-support */
  742.  
  743.      lastsignal = 1 << allocsignal;                           /**/
  744.  
  745.      CatalogPtr = OpenCatalogA (NULL, FMCATALOGNAME, NULL);   /**/
  746.  
  747.      LocalizeMenu ((struct NewMenu *) &ProgMenu);             /**/
  748.  
  749.      if (!(RexxSysBase = (struct RxsLib *) OpenLibrary("rexxsyslib.library", 36L))) {return(RETURNVALUE);}
  750.  
  751.      NewList(&ARexxEventList);
  752.  
  753.      ARexxEventList.lh_Type = NT_USER;
  754.  
  755.      CPUINFO = CheckCPU (SysBase->AttnFlags);
  756.  
  757.      if (ModeNotAvailable (MYILBM.camg)) MYILBM.camg = ModeFallBack (MYILBM.camg,MYILBM.Bmhd.w,MYILBM.Bmhd.h,MYILBM.Bmhd.nPlanes);
  758.  
  759.      if (MYILBM.Bmhd.nPlanes > GetMaxPlanes (MYILBM.camg)) MYILBM.Bmhd.nPlanes = GetMaxPlanes (MYILBM.camg);
  760.  
  761.      if (MYILBM.Bmhd.nPlanes < MIN_DEPTH)
  762.      {
  763.         DisplayError (NULL, TXT_ERR_OpenDisplay, 20L);
  764.  
  765.         goto End;
  766.      }
  767.  
  768.      PALETTE = (CheckGFX () ? COLORS_AGA : COLORS_ECS);
  769.  
  770.      if ((RMIN >= RMAX) || (IMIN >= IMAX))
  771.      {
  772.        DEF_RMIN = INIT_DEF_RMIN;
  773.  
  774.        DEF_RMAX = INIT_DEF_RMAX;
  775.  
  776.        DEF_IMIN = INIT_DEF_IMIN;
  777.  
  778.        DEF_IMAX = INIT_DEF_IMAX;
  779.      }
  780.  
  781.      else
  782.      {
  783.        DEF_RMIN = RMIN;
  784.  
  785.        DEF_RMAX = RMAX;
  786.  
  787.        DEF_IMIN = IMIN;
  788.  
  789.        DEF_IMAX = IMAX;
  790.      }
  791.  
  792.      MYILBM.ParseInfo.propchks = IlbmProps;
  793.  
  794.      MYILBM.ParseInfo.collectchks = IlbmCollects;
  795.  
  796.      MYILBM.ParseInfo.stopchks = IlbmStops;
  797.  
  798.      MYILBM.Bmhd.pageWidth  = 0;
  799.  
  800.      MYILBM.Bmhd.pageHeight = 0;
  801.  
  802.      MYILBM.stype = CUSTOMSCREEN | SCREENQUIET;
  803.  
  804.      MYILBM.TBState = TMASK & MASK;
  805.  
  806.      MYILBM.ucliptype = OSCAN_TEXT;
  807.  
  808.      MYILBM.EHB = FALSE;
  809.  
  810.      MYILBM.Autoscroll = TRUE;
  811.  
  812.      MYILBM.IFFPFlags = NULL;
  813.  
  814.      if (MAINMENU = CreateMenus (ProgMenu,TAG_END))
  815.      {
  816.         if (MYILBM.Bmhd.nPlanes < 6)
  817.         {
  818.            MAX_ITERATIONS = 256;
  819.  
  820.            ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags &= ~CHECKED;
  821.  
  822.            ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  823.         }
  824.  
  825.        switch (PRIORITY)
  826.         {
  827.           case -5: ItemAddress (MAINMENU,FULLMENUNUM (1,4,0))->Flags |= CHECKED;
  828.  
  829.                    break;
  830.  
  831.           case -4: ItemAddress (MAINMENU,FULLMENUNUM (1,4,1))->Flags |= CHECKED;
  832.  
  833.                    break;
  834.  
  835.           case -3: ItemAddress (MAINMENU,FULLMENUNUM (1,4,2))->Flags |= CHECKED;
  836.  
  837.                    break;
  838.  
  839.           case -2: ItemAddress (MAINMENU,FULLMENUNUM (1,4,3))->Flags |= CHECKED;
  840.  
  841.                    break;
  842.  
  843.           case -1: ItemAddress (MAINMENU,FULLMENUNUM (1,4,4))->Flags |= CHECKED;
  844.  
  845.                    break;
  846.  
  847.           case  0: ItemAddress (MAINMENU,FULLMENUNUM (1,4,6))->Flags |= CHECKED;
  848.  
  849.                    break;
  850.  
  851.           case  1: ItemAddress (MAINMENU,FULLMENUNUM (1,4,8))->Flags |= CHECKED;
  852.  
  853.                    break;
  854.  
  855.           case  2: ItemAddress (MAINMENU,FULLMENUNUM (1,4,9))->Flags |= CHECKED;
  856.  
  857.                    break;
  858.  
  859.           case  3: ItemAddress (MAINMENU,FULLMENUNUM (1,4,10))->Flags |= CHECKED;
  860.  
  861.                    break;
  862.  
  863.           case  4: ItemAddress (MAINMENU,FULLMENUNUM (1,4,11))->Flags |= CHECKED;
  864.  
  865.                    break;
  866.  
  867.           case  5: ItemAddress (MAINMENU,FULLMENUNUM (1,4,12))->Flags |= CHECKED;
  868.  
  869.                    break;
  870.         }
  871.  
  872.         SetTaskPri (FindTask (NULL),PRIORITY);
  873.  
  874.         ItemAddress (MAINMENU,FULLMENUNUM (1,3,MANDChunk.Power))->Flags |= CHECKED;
  875.  
  876.         if (MANDChunk.Flags & LINEAR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED;
  877.  
  878.         else if (MANDChunk.Flags & LOG_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  879.  
  880.              else if (MANDChunk.Flags & REPEATED_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,2))->Flags |= CHECKED;
  881.  
  882.                   else if (MANDChunk.Flags & SQUARE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,3))->Flags |= CHECKED;
  883.  
  884.         if (MANDChunk.Flags & JULIA_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags |= CHECKED;
  885.  
  886.         else if (MANDChunk.Flags & MANDEL_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED;
  887.  
  888.  
  889.         if (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620|CPU_G3|CPU_G4|CPU_G5))
  890.         {
  891.            if (MANDChunk.Flags & PPC_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,7,1))->Flags |= CHECKED;
  892.  
  893.            else ItemAddress (MAINMENU,FULLMENUNUM (1,7,0))->Flags |= CHECKED;
  894.         }
  895.  
  896.         else
  897.         {
  898.            ItemAddress (MAINMENU,FULLMENUNUM (1,7,NOSUB))->Flags |= NM_ITEMDISABLED;
  899.  
  900.            MANDChunk.Flags &= ~PPC_BIT;
  901.  
  902.            MANDChunk.Flags |= MC68K_BIT;
  903.  
  904.         }
  905.  
  906.         if (COLORS = MakeDisplay (&MYILBM))
  907.         {
  908.  
  909.            CreateARexxMenu (NULL);
  910.  
  911.            SetARexxMenu (&MYILBM);
  912.  
  913.            COLORS -= RESERVED_PENS;
  914.  
  915.            SaveCoords (MYILBM.win,FALSE);
  916.  
  917.            MANDChunk.LeftEdge = MYILBM.win->LeftEdge;
  918.  
  919.            MANDChunk.TopEdge = MYILBM.win->TopEdge;
  920.  
  921.            MANDChunk.Width = MYILBM.win->Width;
  922.  
  923.            MANDChunk.Height = MYILBM.win->Height;
  924.  
  925.            MANDChunk.RMin = RMIN;
  926.  
  927.            MANDChunk.RMax = RMAX;
  928.  
  929.            MANDChunk.IMin = IMIN;
  930.  
  931.            MANDChunk.IMax = IMAX;
  932.  
  933.            MANDChunk.Iterations = MAX_ITERATIONS;
  934.  
  935.            SPECIAL_CHUNK.ch_Data = &MANDChunk;
  936.  
  937.            PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER);
  938.  
  939.            LaunchIt (&MYILBM, "startup.rexx", "FLASHMANDEL:arexx");
  940.  
  941.            ELAPSEDTIME = DrawFractal (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height,TRUE);
  942.  
  943.            PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  944.  
  945.            SetMenuStart (MYILBM.win);
  946.  
  947.            ShowTime (MYILBM.win,CATSTR(TXT_RenderTime),ELAPSEDTIME);
  948.  
  949.            ModifyIDCMP (MYILBM.win,NULL);
  950.  
  951.            ClearMenuStrip (MYILBM.win);
  952.  
  953.            if (ResourceBase) Do_InfoRequest (MYILBM.win, FMSCREENNAME, 0, 0);
  954.  
  955.            else About (MYILBM.win);
  956.  
  957.            ResetMenuStrip (MYILBM.win,MAINMENU);
  958.  
  959.            ModifyIDCMP (MYILBM.win,IDCMP_STANDARD);
  960.  
  961.            do
  962.            {
  963.              while (HandleEvents (&MYILBM) & NEWDISPLAY_MSG)
  964.              {
  965.                    if (SMRequest (&MYILBM))
  966.                    {
  967.                       if (ZMASK & MASK)
  968.                       {
  969.                          DrawBorder (MYILBM.wrp,&MYBORDER,0,0);
  970.  
  971.                          MASK &= ~ZMASK;
  972.                       }
  973.  
  974.                       if (MYILBM.win->RPort->BitMap->Depth <= MYILBM.Bmhd.nPlanes)
  975.                       {
  976.                          MYBITMAP = CopyBitMap (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height);
  977.                       }
  978.  
  979.                       Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  980.  
  981.                       CloseDisplay (&MYILBM,VINFO);
  982.  
  983.                       MYILBM.Bmhd.pageWidth  = 0;
  984.  
  985.                       MYILBM.Bmhd.pageHeight = 0;
  986.  
  987.                       COLORS = MakeDisplay (&MYILBM);
  988.  
  989.                       if (COLORS)
  990.                       {
  991.                          COLORS -= RESERVED_PENS;
  992.  
  993.                          PasteBitMap (MYBITMAP,MYILBM.win,(WORD) GetBitMapAttr (MYBITMAP,BMA_WIDTH),(WORD) GetBitMapAttr (MYBITMAP,BMA_HEIGHT));
  994.  
  995.                          if (ResourceBase) res = Do_RenderRequest(MYILBM.win,FMSCREENNAME,0,0);
  996.  
  997.                          else res = Choice (MYILBM.win,CATSTR (TITLE_RenderReq),CATSTR (NewScr_TXT_Question));
  998.  
  999.                          if (res)
  1000.                          {
  1001.                             SetMenuStop (MYILBM.win);
  1002.  
  1003.                             PutPointer (MYILBM.win,0,0,0,0,0,BUSY_POINTER);
  1004.  
  1005.                             ELAPSEDTIME = DrawFractal (MYILBM.win,MYILBM.win->LeftEdge,MYILBM.win->TopEdge,MYILBM.win->Width,MYILBM.win->Height,TRUE);
  1006.  
  1007.                             PutPointer (MYILBM.win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  1008.  
  1009.                             SetMenuStart (MYILBM.win);
  1010.  
  1011.                             ShowTime (MYILBM.win, CATSTR(TXT_RenderTime),ELAPSEDTIME);
  1012.                          }
  1013.                       }
  1014.  
  1015.                       else
  1016.                       {
  1017.                             DisplayError(NULL, TXT_ERR_MakeDisplay, 20L);
  1018.  
  1019.                             break;
  1020.                       }
  1021.                    }
  1022.              }
  1023.  
  1024.              if (RETURNVALUE >= 20L) break;
  1025.  
  1026.              if (ForceAbort == FALSE)
  1027.              {
  1028.  
  1029.                if (ResourceBase) res = Do_ExitRequest (MYILBM.win, FMSCREENNAME, 0, 0);
  1030.  
  1031.                else res = Choice (MYILBM.win, CATSTR(TITLE_ExitReq), CATSTR(Prt_TXT_AreYouSure));
  1032.  
  1033.              }
  1034.  
  1035.              else res = TRUE;
  1036.  
  1037.            } while (! res);
  1038.  
  1039.            if (BMASK & MASK) FreeBitMapSafety (MYBITMAP);
  1040.  
  1041.            RemoveARexxMenu (&MYILBM);
  1042.  
  1043.            FreeARexxMenu ();
  1044.         }
  1045.  
  1046.         else DisplayError (NULL, TXT_ERR_MakeDisplay, 20L);
  1047.  
  1048.         Fade (MYILBM.win,PALETTE,50L,1L,TOBLACK);
  1049.  
  1050.         CloseDisplay (&MYILBM,VINFO);
  1051.  
  1052.         FreeMenus (MAINMENU);
  1053.    }
  1054.  
  1055.    else DisplayError (NULL, TXT_ERR_Menu, 20L);
  1056.  
  1057. End:
  1058.  
  1059.   if (CatalogPtr) CloseCatalog (CatalogPtr);    /* new for reaction-support */
  1060.  
  1061.   if (RexxSysBase) CloseLibrary ((struct Library *) RexxSysBase);
  1062.  
  1063.   FreeSignal (allocsignal);
  1064.  
  1065.   return (RETURNVALUE);
  1066. }
  1067.  
  1068.   /***********************************************************************************************************/
  1069.  
  1070. void PutPointer (struct Window *Win,UWORD *PointerImage,LONG Width,LONG Height,LONG XOrigin,LONG YOrigin,UBYTE Type)
  1071. {
  1072.   switch (Type)
  1073.   {
  1074.      case CLEAR_POINTER:  SetWindowPointer (Win,TAG_END);
  1075.  
  1076.                           break;
  1077.  
  1078.      case BUSY_POINTER:   SetWindowPointer (Win,WA_BusyPointer,TRUE,TAG_END);
  1079.  
  1080.                           break;
  1081.  
  1082.      case ZOOM_POINTER:   SetPointer (Win,PointerImage,Height,Width,XOrigin,YOrigin);
  1083.   }
  1084. }
  1085.  
  1086. UBYTE GetMaxPlanes (ULONG ModeID)
  1087. {
  1088. DisplayInfoHandle DisplayHandle;
  1089.  
  1090. struct DimensionInfo DimensionInfo;
  1091.  
  1092. UBYTE Planes = 0;
  1093.  
  1094.   DisplayHandle = FindDisplayInfo (ModeID);
  1095.  
  1096.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,ModeID))
  1097.   {
  1098.      Planes = DimensionInfo.MaxDepth;
  1099.   }
  1100.  
  1101.   else DisplayError(NULL, TXT_ERR_DimensionInfo, 20L);
  1102.  
  1103.   return Planes;
  1104. }
  1105.  
  1106. ULONG CheckCPU (ULONG CpuFlags)
  1107. {
  1108. ULONG CpuMask = NULL,PPCMask = NULL;
  1109.  
  1110. STRPTR txt_none = CATSTR(TXT_None);
  1111.  
  1112. STRPTR txt_builtin = CATSTR(SysI_TXT_68k_FPU);
  1113.  
  1114.  if (AFF_68060 & CpuFlags) CpuMask |= CPU_060,strcpy (CPU68K_STR,"68060\0");
  1115.  
  1116.  else if (AFF_68040 & CpuFlags) CpuMask |= CPU_040,strcpy (CPU68K_STR,"68040\0");
  1117.  
  1118.       else if (AFF_68030 & CpuFlags) CpuMask |= CPU_030,strcpy (CPU68K_STR,"68030\0");
  1119.  
  1120.            else if (AFF_68020 & CpuFlags) CpuMask |= CPU_020,strcpy (CPU68K_STR,"68020\0");
  1121.  
  1122.                 else if (AFF_68010 & CpuFlags) CpuMask |= CPU_010,strcpy (CPU68K_STR,"68010\0");
  1123.  
  1124.                      else if (! (CpuMask & (CPU_060|CPU_040|CPU_030|CPU_020|CPU_010))) strcpy (CPU68K_STR,"68000\0");
  1125.  
  1126.  if (AFF_FPU40 & CpuFlags) CpuMask |= FPU_040,strcpy (FPU68K_STR, txt_builtin);
  1127.  
  1128.  else if (AFF_68882 & CpuFlags) CpuMask |= FPU_882,strcpy (FPU68K_STR,"68882\0");
  1129.  
  1130.       else if (AFF_68881 & CpuFlags) CpuMask |= FPU_881,strcpy (FPU68K_STR,"68881\0");
  1131.  
  1132.            else if (! (CpuMask & (FPU_040|FPU_882|FPU_881))) strcpy (FPU68K_STR, txt_none);
  1133.  
  1134.  if (PowerPCBase)
  1135.  {
  1136.     PPCMask = GetCPU ();
  1137.  
  1138.     if (CPUF_603 == PPCMask) CpuMask |= CPU_603,strcpy (CPUPPC_STR,"603\0"),strcpy (FPUPPC_STR, txt_builtin);
  1139.  
  1140.     else if (CPUF_603E == PPCMask) CpuMask |= CPU_603e,strcpy (CPUPPC_STR,"603e\0"),strcpy (FPUPPC_STR, txt_builtin);
  1141.  
  1142.          else if (CPUF_604 == PPCMask) CpuMask |= CPU_604,strcpy (CPUPPC_STR,"604\0"),strcpy (FPUPPC_STR, txt_builtin);
  1143.  
  1144.               else if (CPUF_604E == PPCMask) CpuMask |= CPU_604e,strcpy (CPUPPC_STR,"604e\0"),strcpy (FPUPPC_STR, txt_builtin);
  1145.  
  1146.                    else if (CPUF_620 == PPCMask) CpuMask |= CPU_620,strcpy (CPUPPC_STR,"620\0"),strcpy (FPUPPC_STR, txt_builtin);
  1147.  
  1148.                          else if (CPUF_G3 == PPCMask) CpuMask |= CPU_G3,strcpy (CPUPPC_STR,"G3\0"),strcpy (FPUPPC_STR, txt_builtin);
  1149.  
  1150.                               else if (CPUF_G4 == PPCMask) CpuMask |= CPU_G4,strcpy (CPUPPC_STR,"G4\0"),strcpy (FPUPPC_STR, txt_builtin);
  1151.  
  1152.                                    else if (CPUF_G5 == PPCMask) CpuMask |= CPU_G5,strcpy (CPUPPC_STR,"G5\0"),strcpy (FPUPPC_STR, txt_builtin);
  1153.  
  1154. //                                        else if (! (CpuMask & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620|CPU_G3|CPU_G4|CPU_G5))) strcpy (CPUPPC_STR, txt_none),strcpy (FPUPPC_STR, txt_none);
  1155.  
  1156.                                           else strcpy (CPUPPC_STR, txt_none),strcpy (FPUPPC_STR, txt_none);
  1157.  }
  1158.  
  1159.  return CpuMask;
  1160. }
  1161.  
  1162. LONG CheckGFX (VOID)
  1163. {
  1164. DisplayInfoHandle DisplayHandle;
  1165.  
  1166. struct DisplayInfo DisplayInfo;
  1167.  
  1168. BOOL AGA = FALSE,RTG = FALSE;
  1169.  
  1170. ULONG ModeID = (ULONG) INVALID_ID;
  1171.  
  1172.   if (GetMaxPlanes (LORES_KEY) == MAX_DEPTH) AGA = TRUE;
  1173.  
  1174.   while (((ModeID = NextDisplayInfo (ModeID)) != INVALID_ID) && RTG == FALSE)
  1175.   {
  1176.         DisplayHandle = FindDisplayInfo (ModeID);
  1177.  
  1178.         if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,ModeID))
  1179.         {
  1180.            if ((DisplayInfo.PropertyFlags & DIPF_IS_FOREIGN) && (GetMaxPlanes (ModeID) >= MAX_DEPTH)) RTG = TRUE;
  1181.         }
  1182.   }
  1183.  
  1184.   if (RTG && AGA) return 3L;
  1185.  
  1186.   if (RTG) return 2L;
  1187.  
  1188.   if (AGA) return 1L;
  1189.  
  1190.   return NULL;
  1191. }
  1192.  
  1193. VOID CloseDisplay (struct ILBMInfo *Ilbm,CPTR *VInfo)
  1194. {
  1195.   if (PMASK & MASK)
  1196.   {
  1197.       FreeVec32 (GfxPpcMem);
  1198.  
  1199.       MASK &= ~PMASK;
  1200.   }
  1201.  
  1202.   if (WMASK & MASK)
  1203.   {
  1204.      ClearMenuStrip (Ilbm->win);
  1205.  
  1206.      PutPointer (Ilbm->win,0,0,0,0,0,CLEAR_POINTER);
  1207.  
  1208.      CloseWindow (Ilbm->win);
  1209.  
  1210.      Ilbm->win = NULL;
  1211.  
  1212.      Ilbm->wrp = NULL;
  1213.  
  1214.      MASK &= ~WMASK;
  1215.   }
  1216.  
  1217.   if (VMASK & MASK)
  1218.   {
  1219.      FreeVisualInfo (VInfo);
  1220.  
  1221.      MASK &= ~VMASK;
  1222.   }
  1223.  
  1224.   if (LMASK & MASK)
  1225.   {
  1226.      FreeVec (PixelLine);
  1227.  
  1228.      MASK &= ~LMASK;
  1229.   }
  1230.  
  1231.   if (SMASK & MASK)
  1232.   {
  1233.      FreeReaction ();         /* new for reaction-support */
  1234.  
  1235.      CloseDownDisplay (Ilbm->scr);
  1236.  
  1237.      CloseScreen (Ilbm->scr);
  1238.  
  1239.      FreeBitMapSafety (Ilbm->brbitmap);
  1240.  
  1241.      Ilbm->scr = NULL;
  1242.  
  1243.      Ilbm->vp  = NULL;
  1244.  
  1245.      Ilbm->srp = NULL;
  1246.  
  1247.      MASK &= ~SMASK;
  1248.   }
  1249.  
  1250.   if (FMASK & MASK)
  1251.   {
  1252.      CloseFont (NEWFONT);
  1253.  
  1254.      MASK &= ~FMASK;
  1255.   }
  1256. }
  1257.  
  1258. UWORD SetPubScreenName (TEXT *PubScreenName)
  1259. {
  1260. struct Screen *Scr;
  1261.  
  1262. UWORD Suffix = 2;
  1263.  
  1264. APTR Name = NULL,NameBuf;
  1265.  
  1266.   if (NameBuf = malloc (MAXPUBSCREENNAME+1))
  1267.   {
  1268.      Name = NextPubScreen (NULL,NameBuf);
  1269.  
  1270.      do
  1271.      {
  1272.         if (! strcmp (Name,PubScreenName)) sprintf (PubScreenName,"FlashMandel.%u",Suffix++);
  1273.  
  1274.         if (Scr = LockPubScreen (Name))
  1275.         {
  1276.            Name = NextPubScreen (Scr,NameBuf);
  1277.  
  1278.            UnlockPubScreen (NULL,Scr);
  1279.         }
  1280.  
  1281.      }  while (Name && strcmp (Name,"Workbench"));
  1282.   }
  1283.  
  1284.   free (NameBuf);
  1285.  
  1286.   return (Suffix - 2);
  1287. }
  1288.  
  1289. struct Window *OpenDisplay (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  1290. {
  1291. struct Screen *Scr;
  1292.  
  1293. struct Window *Win = NULL;
  1294.  
  1295.   if (Scr = OpenIdScreen (Ilbm,Width,Height,Depth,ModeID))
  1296.   {
  1297.      Win = OpenWindowTags (NULL,
  1298.                            WA_Left,Scr->LeftEdge,
  1299.                            WA_Top,Scr->TopEdge,
  1300.                            WA_Width,Scr->Width,
  1301.                            WA_Height,Scr->Height,
  1302.                            WA_ScreenTitle,VERSION "by " AUTHOR " " COPYRIGHT_DATE,
  1303.                            WA_CustomScreen,Scr,
  1304.                            WA_IDCMP,IDCMP_STANDARD,
  1305.                            WA_Flags,WFLG_STANDARD,
  1306.                            WA_MouseQueue,1L,
  1307.                            WA_BusyPointer,TRUE,
  1308.                            TAG_END);
  1309.  
  1310.      if (! Win)
  1311.      {
  1312.         if (Scr) CloseScreen (Scr);
  1313.  
  1314.         return NULL;
  1315.      }
  1316.  
  1317.      Ilbm->scr = Scr;
  1318.  
  1319.      Ilbm->win = Win;
  1320.  
  1321.      Ilbm->vp  = &(Scr->ViewPort);
  1322.  
  1323.      Ilbm->srp = &(Scr->RastPort);
  1324.  
  1325.      Ilbm->wrp = Win->RPort;
  1326.  
  1327.      Ilbm->Bmhd.w = Ilbm->win->Width - Ilbm->win->LeftEdge;
  1328.  
  1329.      Ilbm->Bmhd.h = Ilbm->win->Height - Ilbm->win->TopEdge;
  1330.  
  1331.      Ilbm->Bmhd.nPlanes = Ilbm->wrp->BitMap->Depth;
  1332.   }
  1333.  
  1334.   return (Win);
  1335. }
  1336.  
  1337. struct Screen *OpenIdScreen (struct ILBMInfo *Ilbm,WORD Width,WORD Height,WORD Depth,ULONG ModeID)
  1338. {
  1339. struct Rectangle Spos,DClip,TxtO,StdO,MaxO,UClip;
  1340.  
  1341. struct Rectangle *UClipp;
  1342.  
  1343. struct Screen *Scr;
  1344.  
  1345. struct Task *task = NULL;     /* new for reaction-support */
  1346.  
  1347. LONG ErrorCode = NULL,TryNew;
  1348.  
  1349. ULONG BitMapTag,PassedTags;
  1350.  
  1351.   if (! Ilbm) return (NULL);
  1352.  
  1353.   TryNew = ((QueryOverscan (ModeID,&TxtO,OSCAN_TEXT)) && (QueryOverscan (ModeID,&StdO,OSCAN_STANDARD)) && (QueryOverscan (ModeID,&MaxO,OSCAN_MAX)));
  1354.  
  1355.   if (TryNew)
  1356.   {
  1357.      if (Ilbm->Video) Ilbm->ucliptype = OSCAN_VIDEO;
  1358.  
  1359.      if ((Ilbm->ucliptype) && (QueryOverscan (ModeID,&UClip,(LONG) Ilbm->ucliptype))) UClipp = &UClip;
  1360.  
  1361.      else UClipp = NULL;
  1362.  
  1363.      ClipIt (Width,Height,&Spos,&DClip,&TxtO,&StdO,&MaxO,UClipp,Ilbm->IFFPFlags & IFFPF_NOCENTER ? TRUE : FALSE);
  1364.  
  1365.      BitMapTag = ((Ilbm->brbitmap) && (Ilbm->stype & CUSTOMBITMAP)) ? SA_BitMap : TAG_IGNORE;
  1366.  
  1367.      PassedTags = Ilbm->stags ? TAG_MORE : TAG_IGNORE;
  1368.  
  1369.      task = (struct Task *) &((struct Process *) FindTask (NULL))->pr_Task;     /* new for reaction-support */
  1370.  
  1371.      SetPubScreenName (FMSCREENNAME);
  1372.  
  1373.      Scr = OpenScreenTags (NULL,
  1374.                            SA_DisplayID,   ModeID,
  1375.                            SA_Type,        Ilbm->stype,
  1376.                            SA_Top,         Spos.MinY,
  1377.                            SA_Left,        Spos.MinX,
  1378.                            SA_Width,       Width,
  1379.                            SA_Height,      Height,
  1380.                            SA_Depth,       Depth,
  1381.                            SA_DClip,       &DClip,
  1382.                            SA_AutoScroll,  Ilbm->Autoscroll,
  1383.                            SA_Colors32,    PALETTE,
  1384.                            SA_Pens,        PENS,
  1385.                            SA_Interleaved, TRUE,
  1386.                            SA_Font,        &MYFONTSTRUCT,
  1387.                            SA_Title,       VERSION "by " AUTHOR " " COPYRIGHT_DATE,
  1388.                            SA_PubName,     FMSCREENNAME,     /* new for reaction-support */
  1389.                            SA_PubSig,      allocsignal,       /* new for reaction-support */
  1390.                            SA_PubTask,     task,              /* new for reaction-support */
  1391. //                           SA_SharePens,   TRUE,
  1392.                            SA_ErrorCode,   &ErrorCode,
  1393.                            SA_ShowTitle,   Ilbm->TBState,
  1394.                            BitMapTag,      Ilbm->brbitmap,
  1395.                            PassedTags,     Ilbm->stags,
  1396.                            TAG_END);
  1397.  
  1398.      if (! Scr)
  1399.      {
  1400.         switch (ErrorCode)
  1401.         {
  1402.                  case OSERR_NOMONITOR   : DisplayError (NULL, TXT_ERR_NoMonitor, 20L);
  1403.  
  1404.                                           break;
  1405.  
  1406.                  case OSERR_NOCHIPS     : DisplayError (NULL, TXT_ERR_NoChips, 20L);
  1407.  
  1408.                                           break;
  1409.  
  1410.                  case OSERR_NOMEM       : DisplayError (NULL, TXT_ERR_NoMem, 20L);
  1411.  
  1412.                                           break;
  1413.  
  1414.                  case OSERR_NOCHIPMEM   : DisplayError (NULL, TXT_ERR_NoChipMem, 20L);
  1415.  
  1416.                                           break;
  1417.  
  1418.                  case OSERR_PUBNOTUNIQUE: DisplayError (NULL, TXT_ERR_PubNotUnique, 20L);
  1419.  
  1420.                                           break;
  1421.  
  1422.                  case OSERR_UNKNOWNMODE : DisplayError (NULL, TXT_ERR_UnknownMode, 20L);
  1423.  
  1424.                                           break;
  1425.  
  1426.                  case OSERR_TOODEEP     : DisplayError (NULL, TXT_ERR_ScreenToDeep, 20L);
  1427.  
  1428.                                           break;
  1429.  
  1430.                  case OSERR_ATTACHFAIL  : DisplayError (NULL, TXT_ERR_AttachScreen, 20L);
  1431.  
  1432.                                           break;
  1433.  
  1434.                  case OSERR_NOTAVAILABLE: DisplayError (NULL, TXT_ERR_ModeNotAvailable, 20L);
  1435.  
  1436.                                           break;
  1437.  
  1438.                  default                : DisplayError (NULL, TXT_ERR_UnknownErr, 20L);
  1439.  
  1440.                                           break;
  1441.         }
  1442.  
  1443.         return NULL;
  1444.      }
  1445.  
  1446.      else
  1447.      {
  1448.         oldstatus = PubScreenStatus (Scr,0);     /* new for reaction-support */
  1449.  
  1450.         InitReaction (FMSCREENNAME);
  1451.      }
  1452.   }
  1453.  
  1454.   else return NULL;
  1455.  
  1456.   return (Scr);
  1457. }
  1458.  
  1459. ULONG ModeFallBack (ULONG OldModeID,WORD Width,WORD Height,WORD Depth)
  1460. {
  1461. struct Screen *PubScreen;
  1462.  
  1463. ULONG NewModeID = HIRESLACE_KEY,ModeID;
  1464.  
  1465.   if (PubScreen = LockPubScreen (NULL))
  1466.   {
  1467.      NewModeID = GetVPModeID (&(PubScreen->ViewPort));
  1468.  
  1469.      UnlockPubScreen (NULL,PubScreen);
  1470.   }
  1471.  
  1472.   ModeID = BestModeID (BIDTAG_SourceID, NewModeID,
  1473.                        BIDTAG_DesiredWidth, Width,
  1474.                        BIDTAG_DesiredHeight, Height,
  1475.                        BIDTAG_Depth, Depth,
  1476.                        TAG_END);
  1477.  
  1478.   if (ModeID != INVALID_ID) NewModeID = ModeID;
  1479.  
  1480.   return (NewModeID);
  1481. }
  1482.  
  1483. VOID ClipIt (WORD wide,WORD high,struct Rectangle *spos,struct Rectangle *dclip,struct Rectangle *txto, struct Rectangle *stdo,struct Rectangle *maxo, struct Rectangle *uclip,BOOL NoCenter)
  1484. {
  1485. struct Rectangle *besto;
  1486.  
  1487. WORD minx, maxx, miny, maxy;
  1488.  
  1489. WORD txtw, txth, stdw, stdh, bestw, besth;
  1490.  
  1491.     /* get the txt, std and max widths and heights */
  1492.  
  1493.     txtw = txto->MaxX - txto->MinX + 1;
  1494.  
  1495.     txth = txto->MaxY - txto->MinY + 1;
  1496.  
  1497.     stdw = stdo->MaxX - stdo->MinX + 1;
  1498.  
  1499.     stdh = stdo->MaxY - stdo->MinY + 1;
  1500.  
  1501.     if ((wide <= txtw) && (high <= txth))
  1502.     {
  1503.         besto = txto;
  1504.  
  1505.         bestw = txtw;
  1506.  
  1507.         besth = txth;
  1508.     }
  1509.  
  1510.     else
  1511.     {
  1512.         besto = stdo;
  1513.  
  1514.         bestw = stdw;
  1515.  
  1516.         besth = stdh;
  1517.     }
  1518.  
  1519.     if (uclip)
  1520.     {
  1521.         *dclip = *uclip;
  1522.  
  1523.         spos->MinX = uclip->MinX;
  1524.  
  1525.         spos->MinY = uclip->MinY;
  1526.     }
  1527.  
  1528.     else
  1529.     {
  1530.         /* CENTER the screen based on best oscan prefs
  1531.         * but confine dclip within max oscan limits
  1532.         *
  1533.         * FIX MinX first */
  1534.  
  1535.         spos->MinX = minx = besto->MinX - ((wide - bestw) >> 1);
  1536.  
  1537.         maxx = wide + minx - 1;
  1538.  
  1539.         if (maxx > maxo->MaxX)  maxx = maxo->MaxX;      /* too right */
  1540.  
  1541.         if (minx < maxo->MinX)
  1542.         {
  1543.             minx = maxo->MinX;  /* too left  */
  1544.  
  1545.             /* if we want left edge of screen not clipped */
  1546.  
  1547.             if (NoCenter) spos->MinX = minx;
  1548.         }
  1549.  
  1550.         /* FIX MinY */
  1551.  
  1552.         spos->MinY = miny = besto->MinY - ((high - besth) >> 1);
  1553.  
  1554.         /* if lower than top of txto, move up */
  1555.  
  1556.         spos->MinY = miny = MIN (spos->MinY,txto->MinY);
  1557.  
  1558.         maxy = high + miny - 1;
  1559.  
  1560.         if (maxy > maxo->MaxY)  maxy = maxo->MaxY;      /* too down  */
  1561.  
  1562.         if (miny < maxo->MinY)
  1563.         {
  1564.            miny = maxo->MinY;   /* too up    */
  1565.  
  1566.            /* if we want top of screen not clipped */
  1567.  
  1568.            if (NoCenter) spos->MinY = miny;
  1569.         }
  1570.  
  1571.         /* SET up dclip */
  1572.  
  1573.         dclip->MinX = minx;
  1574.  
  1575.         dclip->MinY = miny;
  1576.  
  1577.         dclip->MaxX = maxx;
  1578.  
  1579.         dclip->MaxY = maxy;
  1580.     }
  1581. }
  1582.  
  1583. LONG MakeDisplay (struct ILBMInfo *Ilbm)
  1584. {
  1585. static ULONG SAVED_COMPONENT = NULL,SAVED_POSITION = NULL;
  1586.  
  1587.   if (Ilbm->IFFPFlags & IFFPF_USERMODE) Ilbm->camg = Ilbm->usermodeid;
  1588.  
  1589.   Ilbm->Bmhd.w = MAX (MIN_WIDTH,Ilbm->Bmhd.w);
  1590.  
  1591.   Ilbm->Bmhd.h = MAX (MIN_HEIGHT,Ilbm->Bmhd.h);
  1592.  
  1593.   if (ModeNotAvailable (Ilbm->camg) || (Ilbm->IFFPFlags & IFFPF_BESTFIT))
  1594.  
  1595.      Ilbm->camg = ModeFallBack (Ilbm->camg,Ilbm->Bmhd.w,Ilbm->Bmhd.h,Ilbm->Bmhd.nPlanes);
  1596.  
  1597.   Ilbm->Bmhd.nPlanes = MAX (MIN_DEPTH,Ilbm->Bmhd.nPlanes);
  1598.  
  1599.   if (Ilbm->Bmhd.nPlanes > GetMaxPlanes (Ilbm->camg)) Ilbm->Bmhd.nPlanes = GetMaxPlanes (Ilbm->camg);
  1600.  
  1601.   if (NEWFONT = OpenDiskFont (&MYFONTSTRUCT)) MASK |= FMASK;
  1602.  
  1603.   else
  1604.   {
  1605.      strcpy (MYFONTSTRUCT.ta_Name,DEF_FONTNAMESTR);
  1606.  
  1607.      MYFONTSTRUCT.ta_YSize = DEF_FONTSIZE;
  1608.  
  1609.      MYFONTSTRUCT.ta_Style = FS_NORMAL;
  1610.  
  1611.      MYFONTSTRUCT.ta_Flags = FPF_ROMFONT;
  1612.  
  1613.      if (NEWFONT = OpenFont (&MYFONTSTRUCT)) MASK |= FMASK;
  1614.  
  1615.      else
  1616.      {
  1617.        DisplayError (NULL, TXT_ERR_Font, 20L);
  1618.  
  1619.        return NULL;
  1620.      }
  1621.   }
  1622.  
  1623.   PALETTE [0L] = ((ULONG) (1L << Ilbm->Bmhd.nPlanes) << 16);
  1624.  
  1625.   if (SAVED_POSITION) PALETTE [SAVED_POSITION] = SAVED_COMPONENT;
  1626.  
  1627.   SAVED_POSITION = 3L * (1L << Ilbm->Bmhd.nPlanes) + 1;
  1628.  
  1629.   SAVED_COMPONENT = PALETTE [SAVED_POSITION];
  1630.  
  1631.   PALETTE [SAVED_POSITION] = NULL;
  1632.  
  1633.   if (! (OpenDisplay (Ilbm,MAX (Ilbm->Bmhd.pageWidth,Ilbm->Bmhd.w),MAX (Ilbm->Bmhd.pageHeight,Ilbm->Bmhd.h),Ilbm->Bmhd.nPlanes,Ilbm->camg))) return NULL;
  1634.  
  1635.   MASK |= SMASK;
  1636.  
  1637.   MASK |= WMASK;
  1638.  
  1639.   if (! (PixelLine = AllocVec ((((MAX (Ilbm->Bmhd.w,Ilbm->Bmhd.h) + 15) >> 4)  << 4),MEMF_CLEAR | MEMF_PUBLIC)))
  1640.   {
  1641.      DisplayError (NULL, TXT_ERR_NoMem, 20L);
  1642.  
  1643.      return (NULL);
  1644.   }
  1645.  
  1646.   MASK |= LMASK;
  1647.  
  1648.   if (! (VINFO = GetVisualInfo (Ilbm->scr,TAG_END)))
  1649.   {
  1650.      DisplayError (NULL, TXT_ERR_VisualInfo, 20L);
  1651.  
  1652.      return NULL;
  1653.   }
  1654.  
  1655.   MASK |= VMASK;
  1656.  
  1657.   if (! (LayoutMenus (MAINMENU,VINFO,GTMN_TextAttr,&MYFONTSTRUCT,GTMN_NewLookMenus,TRUE,TAG_END)))
  1658.   {
  1659.      DisplayError (NULL, TXT_ERR_Font, 20L);
  1660.  
  1661.      return NULL;
  1662.   }
  1663.  
  1664.   if (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620|CPU_G3|CPU_G4|CPU_G5))
  1665.   {
  1666.      if (GfxPpcMem = AllocVec32 (((((Ilbm->Bmhd.w+15) >> 4) << 4) * (Ilbm->Bmhd.h+1)), MEMF_PUBLIC)) MASK |= PMASK;
  1667.  
  1668.      else
  1669.      {
  1670.         ItemAddress (MAINMENU,FULLMENUNUM (1,7,NOSUB))->Flags |= NM_ITEMDISABLED;
  1671.  
  1672.         MANDChunk.Flags |= MC68K_BIT;
  1673.  
  1674.         MANDChunk.Flags &= ~PPC_BIT;
  1675.      }
  1676.   }
  1677.  
  1678.   SetMenuStrip (Ilbm->win,MAINMENU);
  1679.  
  1680.   Ilbm->EHB = FALSE;
  1681.  
  1682.   return (1L << Ilbm->Bmhd.nPlanes);
  1683. }
  1684.  
  1685. VOID ShowTime (struct Window *Win,TEXT *String,ULONG Secs)
  1686. {
  1687.   if (Secs)
  1688.  
  1689.      sprintf (BAR_STRING, CATSTR(TXT_AverageSpeed),String,Secs / 3600L,(Secs / 60L) % 60L,Secs % 60L,(LDouble) ((Win->Width - Win->BorderLeft - Win->BorderRight) * (Win->Height - Win->BorderTop - Win->BorderBottom)) / Secs);
  1690.  
  1691.   else
  1692.  
  1693.      sprintf (BAR_STRING, CATSTR(TXT_LessThanOne),String);
  1694.  
  1695.   SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  1696. }
  1697.  
  1698. void SaveCoords (struct Window *Win,BOOL ShowMenu)
  1699. {
  1700.   URMIN = RMIN;
  1701.  
  1702.   URMAX = RMAX;
  1703.  
  1704.   UIMIN = IMIN;
  1705.  
  1706.   UIMAX = IMAX;
  1707.  
  1708.   UJKRE = JKRE;
  1709.  
  1710.   UJKIM = JKIM;
  1711.  
  1712.   UITERATIONS = MAX_ITERATIONS;
  1713.  
  1714.   UPOWER = MANDChunk.Power;
  1715.  
  1716.   UFLAGS = MANDChunk.Flags;
  1717.  
  1718.   if (ShowMenu) OnMenu (Win,FULLMENUNUM (2,4,NOSUB));
  1719. }
  1720.  
  1721. void RestoreCoords (struct Window *Win)
  1722. {
  1723.   RMIN = URMIN;
  1724.  
  1725.   RMAX = URMAX;
  1726.  
  1727.   IMIN = UIMIN;
  1728.  
  1729.   IMAX = UIMAX;
  1730.  
  1731.   JKRE = UJKRE;
  1732.  
  1733.   JKIM = UJKIM;
  1734.  
  1735.   MAX_ITERATIONS = UITERATIONS;
  1736.  
  1737.   MANDChunk.Power = UPOWER;
  1738.  
  1739.   MANDChunk.Flags = UFLAGS;
  1740.  
  1741.   CheckMenu (Win);
  1742.  
  1743.   OffMenu (Win,FULLMENUNUM (2,4,NOSUB));
  1744. }
  1745.  
  1746. BOOL NewCoords (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  1747. {
  1748. LDouble KReal,KImag;
  1749.  
  1750.   if (((a2 - a1) < 2) || ((b2 - b1) < 2)) return FALSE;
  1751.  
  1752.   KReal = fabs (RMAX-RMIN) / ((LDouble) Win->Width);
  1753.  
  1754.   KImag = fabs (IMAX-IMIN) / ((LDouble) Win->Height);
  1755.  
  1756.   SaveCoords (Win,TRUE);
  1757.  
  1758.   RMAX = RMIN + ((LDouble) a2 * KReal);
  1759.  
  1760.   IMIN = IMAX - ((LDouble) b2 * KImag);
  1761.  
  1762.   RMIN += ((LDouble) a1 * KReal);
  1763.  
  1764.   IMAX -= ((LDouble) b1 * KImag);
  1765.  
  1766.   return TRUE;
  1767. }
  1768.  
  1769. void AdjustRatio (LDouble *RMin,LDouble *IMax,LDouble *RMax,LDouble *IMin,WORD ScrWidth,WORD ScrHeight,BOOL KeepReal)
  1770. {
  1771. LDouble RWidth,IHeight,RCenter,ICenter;
  1772.  
  1773.   IHeight = *IMax - *IMin;
  1774.  
  1775.   RWidth  = *RMax - *RMin;
  1776.  
  1777.   if (KeepReal)
  1778.   {
  1779.      ICenter = *IMin + (IHeight / 2.0);
  1780.  
  1781.      IHeight = (RWidth * ScrHeight) / ScrWidth;
  1782.  
  1783.      *IMax = ICenter + (IHeight / 2.0);
  1784.  
  1785.      *IMin = ICenter - (IHeight / 2.0);
  1786.   }
  1787.  
  1788.   else
  1789.   {
  1790.      RCenter = *RMin + (RWidth / 2.0);
  1791.  
  1792.      RWidth = (IHeight * ScrWidth) / ScrHeight;
  1793.  
  1794.      *RMax = RCenter + (RWidth / 2.0);
  1795.  
  1796.      *RMin = RCenter - (RWidth / 2.0);
  1797.   }
  1798. }
  1799.  
  1800. void SystemInfo (struct Window *Win)
  1801. {
  1802. struct EasyStruct MyReq = { sizeof (struct EasyStruct),0, CATSTR(TITLE_SysInfoReq),CATSTR(TXT_SysInfo),CATSTR(TXT_OK)};
  1803.  
  1804.   EasyRequest (Win,&MyReq,NULL,CPU68K_STR,FPU68K_STR,CPUPPC_STR,FPUPPC_STR,AvailMem (MEMF_CHIP),AvailMem (MEMF_FAST),AvailMem (MEMF_CHIP|MEMF_LARGEST),AvailMem (MEMF_FAST|MEMF_LARGEST));
  1805. }
  1806.  
  1807.  
  1808. LONG About (struct Window *Win)
  1809. {
  1810. struct EasyStruct MyReq_1 = { sizeof (struct EasyStruct),0,CATSTR(TITLE_InfoReq),CATSTR(TXT_Info),CATSTR(TXT_OKMore)};
  1811.  
  1812. struct EasyStruct MyReq_2 = { sizeof (struct EasyStruct),0,CATSTR(TITLE_WorkgroupReq),CATSTR(Work_TXT_Workgroup),CATSTR(TXT_OK)};
  1813.  
  1814. LONG More;
  1815.  
  1816.   More = EasyRequest (Win,&MyReq_1,NULL,VERSION,COPYRIGHT_DATE,AUTHOR,ADDRESS,EMAIL);
  1817.  
  1818.   if (! More) EasyRequest (Win,&MyReq_2,NULL);
  1819.  
  1820.   return More;
  1821. }
  1822.  
  1823. ULONG Fail (UBYTE *ErrorString,ULONG ErrorLevel)
  1824. {
  1825.   DisplayBeep (NULL);
  1826.  
  1827.   fputs (ErrorString,stdout);
  1828.  
  1829.   RETURNVALUE = ErrorLevel;
  1830.  
  1831.   return ErrorLevel;
  1832. }
  1833.  
  1834. LONG Choice (struct Window *Win,TEXT *Title,TEXT *String)
  1835. {
  1836. struct EasyStruct MyReq = { sizeof (struct EasyStruct),NULL,0,0, CATSTR(TXT_YesNo)};
  1837.  
  1838.   MyReq.es_Title = Title;
  1839.  
  1840.   MyReq.es_TextFormat = String;
  1841.  
  1842.   return EasyRequest (Win,&MyReq,0);
  1843. }
  1844.  
  1845. BOOL ShowCoords (struct Window *Win)
  1846. {
  1847. struct Gadget *GadList = NULL,*StringGad_1,*StringGad_2,*StringGad_3,*StringGad_4,*StringGad_5,*StringGad_6;
  1848.  
  1849. struct Gadget *MyButtonGad,*MyCheckBoxGad,*MyGad;
  1850.  
  1851. struct Window *GadWin;
  1852.  
  1853. struct IntuiMessage *Message;
  1854.  
  1855. BOOL End = FALSE,Accept = FALSE,Reset = FALSE,Ratio = FALSE,KeepReal = TRUE;
  1856.  
  1857. TEXT String [MAXCHARS];
  1858.  
  1859. UWORD MyCode;
  1860.  
  1861. ULONG MyClass;
  1862.  
  1863. LDouble Tmp_RMIN = RMIN,Tmp_IMAX = IMAX,Tmp_RMAX = RMAX,Tmp_IMIN = IMIN,Tmp_JKRE,Tmp_JKIM;
  1864.  
  1865.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = CHECKBOXGAD.ng_VisualInfo  = VINFO;
  1866.  
  1867.   StringGad_1 = CreateContext (&GadList);
  1868.  
  1869.   TEXTGAD.ng_LeftEdge     = 118;
  1870.  
  1871.   TEXTGAD.ng_TopEdge      = 20;
  1872.  
  1873.   TEXTGAD.ng_Width        = 194;
  1874.  
  1875.   TEXTGAD.ng_Height       = (MYFONTSTRUCT.ta_YSize * 3L) >> 1;
  1876.  
  1877.   TEXTGAD.ng_GadgetText   = CATSTR(Coord_TXT_Left);
  1878.  
  1879.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1880.  
  1881.   sprintf (String,"%+2.16f",RMIN);
  1882.  
  1883.   StringGad_1 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1884.  
  1885.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1886.  
  1887.   TEXTGAD.ng_GadgetText   = CATSTR(Coord_TXT_Top);
  1888.  
  1889.   sprintf (String,"%+2.16f",IMAX);
  1890.  
  1891.   StringGad_2 = CreateGadget (STRING_KIND,StringGad_1,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1892.  
  1893.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1894.  
  1895.   TEXTGAD.ng_GadgetText   = CATSTR(Coord_TXT_Right);
  1896.  
  1897.   TEXTGAD.ng_Flags        = PLACETEXT_RIGHT;
  1898.  
  1899.   sprintf (String,"%+2.16f",RMAX);
  1900.  
  1901.   StringGad_3 = CreateGadget (STRING_KIND,StringGad_2,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1902.  
  1903.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1904.  
  1905.   TEXTGAD.ng_GadgetText   = CATSTR(Coord_TXT_Bottom);
  1906.  
  1907.   sprintf (String,"%+2.16f",IMIN);
  1908.  
  1909.   StringGad_4 = CreateGadget (STRING_KIND,StringGad_3,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1910.  
  1911.   TEXTGAD.ng_TopEdge     += (24 + TEXTGAD.ng_Height);
  1912.  
  1913.   TEXTGAD.ng_GadgetText   = CATSTR(Coord_TXT_JuliaReal);
  1914.  
  1915.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  1916.  
  1917.   sprintf (String,"%+2.16f",JKRE);
  1918.  
  1919.   StringGad_5 = CreateGadget (STRING_KIND,StringGad_4,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1920.  
  1921.   TEXTGAD.ng_TopEdge     += (14 + TEXTGAD.ng_Height);
  1922.  
  1923.   TEXTGAD.ng_GadgetText   = CATSTR(Coord_TXT_JuliaImag);
  1924.  
  1925.   sprintf (String,"%+2.16f",JKIM);
  1926.  
  1927.   StringGad_6 = CreateGadget (STRING_KIND,StringGad_5,&TEXTGAD,GTST_String,String,STRINGA_ReplaceMode,TRUE,GTST_MaxChars,MAXCHARS,GT_Underscore,'_',TAG_END);
  1928.  
  1929.   CHECKBOXGAD.ng_LeftEdge   = 14;
  1930.  
  1931.   CHECKBOXGAD.ng_TopEdge    = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 24;
  1932.  
  1933.   CHECKBOXGAD.ng_Width      = MYFONTSTRUCT.ta_YSize << 1;
  1934.  
  1935.   CHECKBOXGAD.ng_Height     = MYFONTSTRUCT.ta_YSize + 6;
  1936.  
  1937.   CHECKBOXGAD.ng_GadgetText = CATSTR(Coord_TXT_KeepAxis);
  1938.  
  1939.   CHECKBOXGAD.ng_Flags      = PLACETEXT_RIGHT;
  1940.  
  1941.   CHECKBOXGAD.ng_GadgetID   = KEEP;
  1942.  
  1943.   MyCheckBoxGad = CreateGadget (CHECKBOX_KIND,StringGad_6,&CHECKBOXGAD,GTCB_Checked,TRUE,GTCB_Scaled,TRUE,GT_Underscore,'_',TAG_END);
  1944.  
  1945.   BUTTONGAD.ng_LeftEdge   = 14;
  1946.  
  1947.   BUTTONGAD.ng_TopEdge    = CHECKBOXGAD.ng_TopEdge + CHECKBOXGAD.ng_Height + 30;
  1948.  
  1949.   BUTTONGAD.ng_Width      = 90;
  1950.  
  1951.   BUTTONGAD.ng_Height     = (MYFONTSTRUCT.ta_YSize * 3) >> 1;
  1952.  
  1953.   BUTTONGAD.ng_GadgetText = CATSTR(Coord_TXT_Accept);
  1954.  
  1955.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  1956.  
  1957.   MyButtonGad = CreateGadget (BUTTON_KIND,MyCheckBoxGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1958.  
  1959.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1960.  
  1961.   BUTTONGAD.ng_GadgetText = CATSTR(Coord_TXT_Ratio);
  1962.  
  1963.   BUTTONGAD.ng_GadgetID   = RATIO;
  1964.  
  1965.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1966.  
  1967.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1968.  
  1969.   BUTTONGAD.ng_GadgetText = CATSTR(Coord_TXT_Default);
  1970.  
  1971.   BUTTONGAD.ng_GadgetID   = RESET;
  1972.  
  1973.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1974.  
  1975.   BUTTONGAD.ng_LeftEdge  += (14 + BUTTONGAD.ng_Width);
  1976.  
  1977.   BUTTONGAD.ng_GadgetText = CATSTR(Coord_TXT_Cancel);
  1978.  
  1979.   BUTTONGAD.ng_GadgetID   = CANCEL;
  1980.  
  1981.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  1982.  
  1983.   if (MyButtonGad)
  1984.   {
  1985.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25,
  1986.                                    WA_Top,Win->TopEdge + 35,
  1987.                                    WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 24,
  1988.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35,
  1989.                                    WA_Title,CATSTR(TITLE_CoordReq),
  1990.                                    WA_ScreenTitle,CATSTR(TXT_ScrTitle_Coord),
  1991.                                    WA_CustomScreen,Win->WScreen,
  1992.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|STRINGIDCMP|BUTTONIDCMP,
  1993.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  1994.                                    WA_Gadgets,GadList,
  1995.                                    TAG_END);
  1996.      if (GadWin)
  1997.      {
  1998.         GT_RefreshWindow (GadWin,NULL);
  1999.  
  2000.         do {  WaitPort (GadWin->UserPort);
  2001.  
  2002.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  2003.               {
  2004.                      MyGad = (struct Gadget *) Message->IAddress;
  2005.  
  2006.                      MyClass = Message->Class;
  2007.  
  2008.                      MyCode = Message->Code;
  2009.  
  2010.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2011.  
  2012.                      switch (MyClass)
  2013.                      {
  2014.                             case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  2015.  
  2016.                                                        GT_EndRefresh (GadWin,TRUE);
  2017.  
  2018.                                                        break;
  2019.  
  2020.                             case IDCMP_VANILLAKEY    : switch (ToUpper ((ULONG) MyCode))
  2021.                                                        {
  2022.                                                               case 'L' : ActivateGadget (StringGad_1,GadWin,0);
  2023.  
  2024.                                                                          break;
  2025.  
  2026.                                                               case 'O' : ActivateGadget (StringGad_2,GadWin,0);
  2027.  
  2028.                                                                          break;
  2029.  
  2030.                                                               case 'R' : ActivateGadget (StringGad_3,GadWin,0);
  2031.  
  2032.                                                                          break;
  2033.  
  2034.                                                               case 'T' : ActivateGadget (StringGad_4,GadWin,0);
  2035.  
  2036.                                                                          break;
  2037.  
  2038.                                                               case 'J' : ActivateGadget (StringGad_5,GadWin,0);
  2039.  
  2040.                                                                          break;
  2041.  
  2042.                                                               case 'U' : ActivateGadget (StringGad_6,GadWin,0);
  2043.  
  2044.                                                                          break;
  2045.  
  2046.                                                               case 'A' : Accept = TRUE;
  2047.  
  2048.                                                                          break;
  2049.  
  2050.                                                               case 'I' : Ratio = TRUE;
  2051.  
  2052.                                                                          break;
  2053.  
  2054.                                                               case 'D' : Reset = TRUE;
  2055.  
  2056.                                                                          break;
  2057.  
  2058.                                                               case 'C' : End = TRUE;
  2059.  
  2060.                                                                          break;
  2061.  
  2062.                                                               case 'X' : KeepReal = ! KeepReal;
  2063.  
  2064.                                                                          GT_SetGadgetAttrs (MyCheckBoxGad,GadWin,NULL,GTCB_Checked,KeepReal,TAG_END);
  2065.  
  2066.                                                                          break;
  2067.  
  2068.                                                            case VAN_ESC: End = TRUE;
  2069.                                                        }
  2070.  
  2071.                                                                break;
  2072.  
  2073.                             case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  2074.                                                        {
  2075.                                                               case ACCEPT:   Accept = TRUE;
  2076.  
  2077.                                                                              break;
  2078.  
  2079.                                                               case  RATIO:   Ratio = TRUE;
  2080.  
  2081.                                                                              break;
  2082.  
  2083.                                                               case  RESET:   Reset = TRUE;
  2084.  
  2085.                                                                              break;
  2086.  
  2087.                                                               case   KEEP:   KeepReal = ! KeepReal;
  2088.  
  2089.                                                                              break;
  2090.  
  2091.                                                               case CANCEL:   End = TRUE;
  2092.                                                        }
  2093.  
  2094.                                                        break;
  2095.  
  2096.                             case IDCMP_CLOSEWINDOW   : End = TRUE;
  2097.                      }
  2098.  
  2099.                      if (Accept)
  2100.                      {
  2101.  
  2102.                         Tmp_RMIN = strtod (((struct StringInfo *) StringGad_1->SpecialInfo)->Buffer,NULL);
  2103.  
  2104.                         Tmp_IMAX = strtod (((struct StringInfo *) StringGad_2->SpecialInfo)->Buffer,NULL);
  2105.  
  2106.                         Tmp_RMAX = strtod (((struct StringInfo *) StringGad_3->SpecialInfo)->Buffer,NULL);
  2107.  
  2108.                         Tmp_IMIN = strtod (((struct StringInfo *) StringGad_4->SpecialInfo)->Buffer,NULL);
  2109.  
  2110.                         Tmp_JKRE = strtod (((struct StringInfo *) StringGad_5->SpecialInfo)->Buffer,NULL);
  2111.  
  2112.                         Tmp_JKIM = strtod (((struct StringInfo *) StringGad_6->SpecialInfo)->Buffer,NULL);
  2113.  
  2114.                         if ((Tmp_RMIN >= Tmp_RMAX) || (Tmp_IMIN >= Tmp_IMAX)) DisplayBeep (Win->WScreen);
  2115.  
  2116.                         else
  2117.                         {
  2118.                            SaveCoords (Win,FALSE);
  2119.  
  2120.                            RMIN = Tmp_RMIN; IMAX = Tmp_IMAX; RMAX = Tmp_RMAX; IMIN = Tmp_IMIN; JKRE = Tmp_JKRE; JKIM = Tmp_JKIM;
  2121.  
  2122.                            End = TRUE;
  2123.                         }
  2124.                      }
  2125.  
  2126.                      if (Ratio)
  2127.                      {
  2128.                         Tmp_RMIN = strtod (((struct StringInfo *) StringGad_1->SpecialInfo)->Buffer,NULL);
  2129.  
  2130.                         Tmp_IMAX = strtod (((struct StringInfo *) StringGad_2->SpecialInfo)->Buffer,NULL);
  2131.  
  2132.                         Tmp_RMAX = strtod (((struct StringInfo *) StringGad_3->SpecialInfo)->Buffer,NULL);
  2133.  
  2134.                         Tmp_IMIN = strtod (((struct StringInfo *) StringGad_4->SpecialInfo)->Buffer,NULL);
  2135.  
  2136.                         Tmp_JKRE = strtod (((struct StringInfo *) StringGad_5->SpecialInfo)->Buffer,NULL);
  2137.  
  2138.                         Tmp_JKIM = strtod (((struct StringInfo *) StringGad_6->SpecialInfo)->Buffer,NULL);
  2139.  
  2140.                         if ((Tmp_RMIN >= Tmp_RMAX) || (Tmp_IMIN >= Tmp_IMAX)) DisplayBeep (Win->WScreen);
  2141.  
  2142.                         else AdjustRatio (&Tmp_RMIN,&Tmp_IMAX,&Tmp_RMAX,&Tmp_IMIN,Win->Width,Win->Height,KeepReal);
  2143.  
  2144.                         TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  2145.  
  2146.                         sprintf (String,"%+2.16f",Tmp_RMIN);
  2147.  
  2148.                         GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  2149.  
  2150.                         sprintf (String,"%+2.16f",Tmp_IMAX);
  2151.  
  2152.                         GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  2153.  
  2154.                         sprintf (String,"%+2.16f",Tmp_RMAX);
  2155.  
  2156.                         TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  2157.  
  2158.                         GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  2159.  
  2160.                         sprintf (String,"%+2.16f",Tmp_IMIN);
  2161.  
  2162.                         GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  2163.  
  2164.                         Ratio = FALSE;
  2165.                      }
  2166.  
  2167.                      if (Reset)
  2168.                      {
  2169.                         TEXTGAD.ng_Flags = PLACETEXT_LEFT;
  2170.  
  2171.                         sprintf (String,"%+2.16f",DEF_RMIN);
  2172.  
  2173.                         GT_SetGadgetAttrs (StringGad_1,GadWin,NULL,GTST_String,String,TAG_END);
  2174.  
  2175.                         sprintf (String,"%+2.16f",DEF_IMAX);
  2176.  
  2177.                         GT_SetGadgetAttrs (StringGad_2,GadWin,NULL,GTST_String,String,TAG_END);
  2178.  
  2179.                         TEXTGAD.ng_Flags = PLACETEXT_RIGHT;
  2180.  
  2181.                         sprintf (String,"%+2.16f",DEF_RMAX);
  2182.  
  2183.                         GT_SetGadgetAttrs (StringGad_3,GadWin,NULL,GTST_String,String,TAG_END);
  2184.  
  2185.                         sprintf (String,"%+2.16f",DEF_IMIN);
  2186.  
  2187.                         GT_SetGadgetAttrs (StringGad_4,GadWin,NULL,GTST_String,String,TAG_END);
  2188.  
  2189.                         sprintf (String,"%+2.16f",DEF_JKRE);
  2190.  
  2191.                         GT_SetGadgetAttrs (StringGad_5,GadWin,NULL,GTST_String,String,TAG_END);
  2192.  
  2193.                         sprintf (String,"%+2.16f",DEF_JKIM);
  2194.  
  2195.                         GT_SetGadgetAttrs (StringGad_6,GadWin,NULL,GTST_String,String,TAG_END);
  2196.  
  2197.                         Reset = FALSE;
  2198.                      }
  2199.               }
  2200.  
  2201.            } while (End == FALSE);
  2202.  
  2203.        CloseWindow (GadWin);
  2204.      }
  2205.  
  2206.      else DisplayError (NULL, TXT_ERR_WindowGadget, 15L);
  2207.  
  2208.   }
  2209.  
  2210.   else DisplayError (NULL, TXT_ERR_Gadget, 15L);
  2211.  
  2212.   FreeGadgets (GadList);
  2213.  
  2214.   return Accept;
  2215. }
  2216.  
  2217. ULONG IntegerGad (struct Window *Win,TEXT *TitleWin,TEXT *TitleScr,TEXT *TxtString,ULONG Var)
  2218. {
  2219. struct IntuiMessage *Message;
  2220.  
  2221. struct Gadget *GadList = NULL,*MyIntGad,*MyButtonGad,*MyGad;
  2222.  
  2223. struct Window *GadWin;
  2224.  
  2225. BOOL End = FALSE;
  2226.  
  2227. UWORD MyCode;
  2228.  
  2229. ULONG MyClass,ReturnValue = Var;
  2230.  
  2231.   TEXTGAD.ng_VisualInfo = BUTTONGAD.ng_VisualInfo = VINFO;
  2232.  
  2233.   MyIntGad = CreateContext (&GadList);
  2234.  
  2235.   TEXTGAD.ng_LeftEdge     = 170;
  2236.  
  2237.   TEXTGAD.ng_TopEdge      = 20;
  2238.  
  2239.   TEXTGAD.ng_Width        = 90;
  2240.  
  2241.   TEXTGAD.ng_Height       = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  2242.  
  2243.   TEXTGAD.ng_GadgetText   = TxtString;
  2244.  
  2245.   TEXTGAD.ng_Flags        = PLACETEXT_LEFT;
  2246.  
  2247.   MyIntGad = CreateGadget (INTEGER_KIND,MyIntGad,&TEXTGAD,GTIN_Number,Var,GTIN_MaxChars,6,STRINGA_ReplaceMode,TRUE,GT_Underscore,'_',TAG_END);
  2248.  
  2249.   BUTTONGAD.ng_LeftEdge   = 20;
  2250.  
  2251.   BUTTONGAD.ng_TopEdge    = TEXTGAD.ng_TopEdge + TEXTGAD.ng_Height + 30;
  2252.  
  2253.   BUTTONGAD.ng_Width      = 90;
  2254.  
  2255.   BUTTONGAD.ng_Height     = (MYFONTSTRUCT.ta_YSize * 3L) >> 1L;
  2256.  
  2257.   BUTTONGAD.ng_GadgetText = CATSTR(Cyc_TXT_Accept);
  2258.  
  2259.   BUTTONGAD.ng_GadgetID   = ACCEPT;
  2260.  
  2261.   MyButtonGad = CreateGadget (BUTTON_KIND,MyIntGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  2262.  
  2263.   BUTTONGAD.ng_LeftEdge  += (60 + BUTTONGAD.ng_Width);
  2264.  
  2265.   BUTTONGAD.ng_GadgetText = CATSTR(Cyc_TXT_Cancel);
  2266.  
  2267.   BUTTONGAD.ng_GadgetID   = CANCEL;
  2268.  
  2269.   MyButtonGad = CreateGadget (BUTTON_KIND,MyButtonGad,&BUTTONGAD,GT_Underscore,'_',TAG_END);
  2270.  
  2271.   if (MyButtonGad)
  2272.   {
  2273.      GadWin = OpenWindowTags (NULL,WA_Left,Win->LeftEdge + 25,
  2274.                                    WA_Top,Win->TopEdge + 35,
  2275.                                    WA_Width,BUTTONGAD.ng_LeftEdge + BUTTONGAD.ng_Width + 30,
  2276.                                    WA_Height,BUTTONGAD.ng_TopEdge + BUTTONGAD.ng_Height + 35,
  2277.                                    WA_Title,TitleWin,
  2278.                                    WA_ScreenTitle,TitleScr,
  2279.                                    WA_CustomScreen,Win->WScreen,
  2280.                                    WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY|INTEGERIDCMP|BUTTONIDCMP,
  2281.                                    WA_Flags,WFLG_ACTIVATE|WFLG_DRAGBAR|WFLG_SIMPLE_REFRESH|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP,
  2282.                                    WA_Gadgets,GadList,
  2283.                                    TAG_END);
  2284.  
  2285.      if (GadWin)
  2286.      {
  2287.         GT_RefreshWindow (GadWin,NULL);
  2288.  
  2289.         do {  WaitPort (GadWin->UserPort);
  2290.  
  2291.               if (Message = (struct IntuiMessage *) GT_GetIMsg (GadWin->UserPort))
  2292.               {
  2293.                      MyGad = (struct Gadget *) Message->IAddress;
  2294.  
  2295.                      MyClass = Message->Class;
  2296.  
  2297.                      MyCode = Message->Code;
  2298.  
  2299.                      GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2300.  
  2301.                      switch (MyClass)
  2302.                      {
  2303.                             case IDCMP_REFRESHWINDOW : GT_BeginRefresh (GadWin);
  2304.  
  2305.                                                        GT_EndRefresh (GadWin,TRUE);
  2306.  
  2307.                                                        break;
  2308.  
  2309.                             case IDCMP_VANILLAKEY    : switch (ToUpper ((ULONG) MyCode))
  2310.                                                        {
  2311.                                                               case 'E' :
  2312.  
  2313.                                                               case 'I' : ActivateGadget (MyIntGad,GadWin,0);
  2314.  
  2315.                                                                          break;
  2316.  
  2317.                                                               case 'A' : ReturnValue = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  2318.  
  2319.                                                                          End = TRUE;
  2320.  
  2321.                                                                          break;
  2322.  
  2323.                                                               case 'C' : End = TRUE;
  2324.  
  2325.                                                                          break;
  2326.  
  2327.                                                            case VAN_ESC: End = TRUE;
  2328.                                                        }
  2329.  
  2330.                                                        break;
  2331.  
  2332.                             case IDCMP_GADGETUP      : switch (MyGad->GadgetID)
  2333.                                                        {
  2334.                                                                case ACCEPT  : ReturnValue = ((struct StringInfo *) MyIntGad->SpecialInfo)->LongInt;
  2335.  
  2336.                                                                               End = TRUE;
  2337.  
  2338.                                                                               break;
  2339.  
  2340.                                                                case CANCEL  : End = TRUE;
  2341.                                                        }
  2342.  
  2343.                                                        break;
  2344.  
  2345.                             case IDCMP_CLOSEWINDOW   : End = TRUE;
  2346.                      }
  2347.               }
  2348.  
  2349.            } while (End == FALSE);
  2350.  
  2351.         CloseWindow (GadWin);
  2352.      }
  2353.  
  2354.      else DisplayError (NULL, TXT_ERR_Window, 15L);
  2355.   }
  2356.  
  2357.   else DisplayError (NULL, TXT_ERR_Gadget, 15L);
  2358.  
  2359.   FreeGadgets (GadList);
  2360.  
  2361.   return ReturnValue;
  2362. }
  2363.  
  2364. UBYTE LinearRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2365. {
  2366.   return ((UBYTE) floor ((Iterations * MaxColors) / MaxIterations));
  2367. }
  2368.  
  2369. UBYTE LogRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2370. {
  2371.   return ((UBYTE) floor ((log (Iterations) * MaxColors) / log (MaxIterations)));
  2372. }
  2373.  
  2374. UBYTE RepeatedRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2375. {
  2376.   return ((UBYTE) ceil (MaxColors - fmod (MaxIterations - Iterations,MaxColors) - 1.0));
  2377. }
  2378.  
  2379. UBYTE SquareRootRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2380. {
  2381.   return ((UBYTE) floor ((sqrt (Iterations) * MaxColors) / sqrt (MaxIterations)));
  2382. }
  2383.  
  2384. UBYTE OneRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2385. {
  2386.   return ((UBYTE) floor (((Iterations * Iterations - Iterations) * MaxColors) / (MaxIterations * MaxIterations - MaxIterations)));
  2387. }
  2388.  
  2389. UBYTE TwoRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2390. {
  2391.   return ((UBYTE) floor ((sqrt (pow (Iterations,3.0) - Iterations * Iterations - Iterations) * MaxColors) / sqrt (pow (MaxIterations,3.0) - MaxIterations * MaxIterations - MaxIterations)));
  2392. }
  2393.  
  2394. UBYTE ThreeRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2395. {
  2396.   return ((UBYTE) floor ((sinh (log (pow (Iterations,3.0))) * MaxColors) / (sinh (log (pow (MaxIterations,3.0))))));
  2397. }
  2398.  
  2399. UBYTE FourRemap (const LDouble Iterations,const LDouble MaxColors,const LDouble MaxIterations)
  2400. {
  2401.   return ((UBYTE) floor ((cosh (log10 (pow (Iterations,3.0))) * MaxColors) / (cosh (log10 (pow (MaxIterations,3.0))))));
  2402. }
  2403.  
  2404. void MVLine (struct RastPort *Rp,const WORD b1,const WORD b2,const WORD x)
  2405. {
  2406. REGISTER WORD y;
  2407.  
  2408. REGISTER UWORD Color;
  2409.  
  2410.  CRE = RMIN + (((LDouble)  x) * INCREMREAL);
  2411.  
  2412.  CIM = IMAX - (((LDouble) b2) * INCREMIMAG);
  2413.  
  2414.  for (y = b2; y >= b1; y--)
  2415.  {
  2416.  
  2417. #ifdef NO_68K_FPU
  2418.      Color = Mandeln68K_NoFPU (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM);
  2419. #endif
  2420.  
  2421. #ifdef USE_68K_FPU_MATH
  2422.      Color = Mandeln68K (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM);
  2423. #endif
  2424.  
  2425. #ifdef FIXEDPOINT_MATH
  2426.      Color = Mandeln68K_Fixed (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM);
  2427. #endif
  2428.  
  2429.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2430.  
  2431.      SetAPen (Rp,Color);
  2432.  
  2433.      CIM += INCREMIMAG;
  2434.  
  2435.      WritePixel (Rp,x,y);
  2436.  }
  2437. }
  2438.  
  2439. void MHLine (struct RastPort *Rp,const WORD a1,const WORD a2,const WORD y)
  2440. {
  2441. REGISTER WORD x;
  2442.  
  2443. REGISTER UBYTE *TmpArray;
  2444.  
  2445. REGISTER UWORD Color;
  2446.  
  2447.  CRE = RMIN + (((LDouble) a1) * INCREMREAL);
  2448.  
  2449.  TmpArray = PixelLine;
  2450.  
  2451.  CIM = IMAX - (((LDouble)  y) * INCREMIMAG);
  2452.  
  2453.  for (x = a1; x <= a2; x++)
  2454.  {
  2455.  
  2456. #ifdef NO_68K_FPU
  2457.      Color = Mandeln68K_NoFPU (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM);
  2458. #endif
  2459.  
  2460. #ifdef USE_68K_FPU_MATH
  2461.      Color = Mandeln68K (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM);
  2462. #endif
  2463.  
  2464. #ifdef FIXEDPOINT_MATH
  2465.      Color = Mandeln68K_Fixed (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM);
  2466. #endif
  2467.  
  2468.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2469.  
  2470.      CRE += INCREMREAL;
  2471.  
  2472.      *TmpArray++ = Color;
  2473.  }
  2474.  
  2475.  WriteChunkyPixels (Rp,a1,y,a2,y,PixelLine,a2-a1);
  2476. }
  2477.  
  2478. void JVLine (struct RastPort *Rp,const WORD b1,const WORD b2,const WORD x)
  2479. {
  2480. REGISTER WORD y;
  2481.  
  2482. REGISTER UWORD Color;
  2483.  
  2484.  CRE = RMIN + (((LDouble)  x) * INCREMREAL);
  2485.  
  2486.  CIM = IMAX - (((LDouble) b2) * INCREMIMAG);
  2487.  
  2488.  for (y = b2; y >= b1; y--)
  2489.  {
  2490.  
  2491. #ifdef NO_68K_FPU
  2492.      Color = Julian68K_NoFPU (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM,JKRE,JKIM);
  2493. #endif
  2494.  
  2495. #ifdef USE_68K_FPU_MATH
  2496.      Color = Julian68K (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM,JKRE,JKIM);
  2497. #endif
  2498.  
  2499. #ifdef FIXEDPOINT_MATH
  2500.      Color = Julian68K_Fixed (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM,JKRE,JKIM);
  2501. #endif
  2502.  
  2503.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2504.  
  2505.      SetAPen (Rp,Color);
  2506.  
  2507.      CIM += INCREMIMAG;
  2508.  
  2509.      WritePixel (Rp,x,y);
  2510.  }
  2511. }
  2512.  
  2513. void JHLine (struct RastPort *Rp,const WORD a1,const WORD a2,const WORD y)
  2514. {
  2515. REGISTER WORD x;
  2516.  
  2517. REGISTER UBYTE *TmpArray;
  2518.  
  2519. REGISTER UWORD Color;
  2520.  
  2521.  CRE = RMIN + (((LDouble) a1) * INCREMREAL);
  2522.  
  2523.  TmpArray = PixelLine;
  2524.  
  2525.  CIM = IMAX - (((LDouble)  y) * INCREMIMAG);
  2526.  
  2527.  for (x = a1; x <= a2; x++)
  2528.  {
  2529.  
  2530. #ifdef NO_68K_FPU
  2531.      Color = Julian68K_NoFPU (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM,JKRE,JKIM);
  2532. #endif
  2533.  
  2534. #ifdef USE_68K_FPU_MATH
  2535.      Color = Julian68K (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM,JKRE,JKIM);
  2536. #endif
  2537.  
  2538. #ifdef FIXEDPOINT_MATH
  2539.      Color = Julian68K_Fixed (MAX_ITERATIONS,MANDChunk.Power,CRE,CIM,JKRE,JKIM);
  2540. #endif
  2541.  
  2542.      if (Color) Color = COLORREMAP (Color,COLORS,MAX_ITERATIONS+1) + RESERVED_PENS;
  2543.  
  2544.      CRE += INCREMREAL;
  2545.  
  2546.      *TmpArray++ = Color;
  2547.  }
  2548.  
  2549.  WriteChunkyPixels (Rp,a1,y,a2,y,PixelLine,a2-a1);
  2550. }
  2551.  
  2552. BOOL CheckBox (struct RastPort *Rp,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2553. {
  2554. const LONG Color = ReadPixel (Rp,a1,b1);
  2555.  
  2556. REGISTER WORD Var;
  2557.  
  2558.   if (Color != ReadPixel (Rp,a2,b2)) return FALSE;
  2559.  
  2560.   if (Color != ReadPixel (Rp,a2,b1)) return FALSE;
  2561.  
  2562.   if (Color != ReadPixel (Rp,a1,b2)) return FALSE;
  2563.  
  2564.   for (Var = (a1 + 1); Var < a2; Var++)
  2565.   {
  2566.       if (Color != ReadPixel (Rp,Var,b1)) return FALSE;
  2567.  
  2568.       if (Color != ReadPixel (Rp,Var,b2)) return FALSE;
  2569.   }
  2570.  
  2571.   for (Var = (b1 + 1); Var < b2; Var++)
  2572.   {
  2573.       if (Color != ReadPixel (Rp,a1,Var)) return FALSE;
  2574.  
  2575.       if (Color != ReadPixel (Rp,a2,Var)) return FALSE;
  2576.   }
  2577.  
  2578.   return TRUE;
  2579. }
  2580.  
  2581. void BlinkRect (struct Window *Win,const WORD LeftEdge,const WORD TopEdge,const WORD RightEdge,const WORD BottomEdge)
  2582. {
  2583. UBYTE Blink = BLINKTIMES;
  2584.  
  2585.   DisplayBeep (Win->WScreen);
  2586.  
  2587.   ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge;
  2588.  
  2589.   ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge;
  2590.  
  2591.   ZOOMLINE [2] = ZOOMLINE [4] = RightEdge;
  2592.  
  2593.   ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge;
  2594.  
  2595.   while (Blink--)
  2596.   {
  2597.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2598.  
  2599.      Delay (8L);
  2600.  
  2601.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2602.  
  2603.      Delay (8L);
  2604.   }
  2605. }
  2606.  
  2607. BOOL RectangleDraw (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2608. {
  2609. struct IntuiMessage *Message;
  2610.  
  2611. UWORD MyCode;
  2612.  
  2613. WORD helpx,helpy;
  2614.  
  2615. ULONG MyClass;
  2616.  
  2617.   if ((helpx = (a2 - a1)) < MINLIMIT) return FALSE;
  2618.  
  2619.   if ((helpy = (b2 - b1)) < MINLIMIT) return FALSE;
  2620.  
  2621.   if (Win->UserPort->mp_SigBit)
  2622.   {
  2623.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  2624.      {
  2625.         MyClass = Message->Class;
  2626.  
  2627.         MyCode  = Message->Code;
  2628.  
  2629.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2630.  
  2631.         switch (MyClass)
  2632.         {
  2633.           case IDCMP_MENUPICK    : if (MyCode != MENUNULL)
  2634.                                    {
  2635.                                       if (ProcessMenu (Win,MyCode) & STOP_MSG) return TRUE;
  2636.                                    }
  2637.  
  2638.                                    break;
  2639.  
  2640.           case IDCMP_RAWKEY      : if (MyCode == TAB)
  2641.                                    {
  2642.                                       BlinkRect (Win,a1,b1,a2,b2);
  2643.  
  2644.                                       return FALSE;
  2645.                                    }
  2646.  
  2647.                                    if (MyCode == RAW_ESC)
  2648.                                    {
  2649.                                       DisplayBeep (Win->WScreen);
  2650.  
  2651.                                       return TRUE;
  2652.                                    }
  2653.  
  2654.                                    break;
  2655.  
  2656.           case IDCMP_CLOSEWINDOW : return TRUE;
  2657.         }
  2658.      }
  2659.   }
  2660.  
  2661.   if (CheckBox (Win->RPort,a1,b1,a2,b2))
  2662.   {
  2663.      SetAPen (Win->RPort,ReadPixel (Win->RPort,a1,b1));
  2664.  
  2665.      RectFill (Win->RPort,a1+1,b1+1,a2-1,b2-1);
  2666.  
  2667.      return FALSE;
  2668.   }
  2669.  
  2670.   if ((helpx < (MINLIMIT * 2)) || (helpy < (MINLIMIT * 2)))
  2671.   {
  2672.      for (helpx = (a1 + 1); helpx < a2; helpx++)
  2673.      {
  2674.          (*V_LINE) (Win->RPort,b1+1,b2-1,helpx);
  2675.      }
  2676.  
  2677.      return FALSE;
  2678.   }
  2679.  
  2680.   if (helpx > helpy)
  2681.   {
  2682.      helpx = (a1 + a2) >> 1;
  2683.  
  2684.      (*V_LINE) (Win->RPort,b1+1,b2-1,helpx);
  2685.  
  2686.      if (RectangleDraw (Win,a1,b1,helpx,b2)) return TRUE;
  2687.  
  2688.      if (RectangleDraw (Win,helpx,b1,a2,b2)) return TRUE;
  2689.   }
  2690.  
  2691.   else
  2692.   {
  2693.      helpy = (b1 + b2) >> 1;
  2694.  
  2695.      (*H_LINE) (Win->RPort,a1+1,a2-1,helpy);
  2696.  
  2697.      if (RectangleDraw (Win,a1,b1,a2,helpy)) return TRUE;
  2698.  
  2699.      if (RectangleDraw (Win,a1,helpy,a2,b2)) return TRUE;
  2700.  
  2701.   }
  2702.  
  2703.   return FALSE;
  2704. }
  2705.  
  2706. void CalcFractal (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2)
  2707. {
  2708.  if (MANDChunk.Flags & JULIA_BIT)
  2709.  {
  2710.     H_LINE = JHLine;
  2711.  
  2712.     V_LINE = JVLine;
  2713.  }
  2714.  
  2715.  else if (MANDChunk.Flags & MANDEL_BIT)
  2716.       {
  2717.          H_LINE = MHLine;
  2718.  
  2719.          V_LINE = MVLine;
  2720.       }
  2721.  
  2722.  if (MANDChunk.Flags & LINEAR_BIT) COLORREMAP = LinearRemap;
  2723.  
  2724.  else if (MANDChunk.Flags & LOG_BIT) COLORREMAP = LogRemap;
  2725.  
  2726.       else if (MANDChunk.Flags & REPEATED_BIT) COLORREMAP = RepeatedRemap;
  2727.  
  2728.            else if (MANDChunk.Flags & SQUARE_BIT) COLORREMAP = SquareRootRemap;
  2729.  
  2730.                 else if (MANDChunk.Flags & ONE_BIT) COLORREMAP = OneRemap;
  2731.  
  2732.                      else if (MANDChunk.Flags & TWO_BIT) COLORREMAP = TwoRemap;
  2733.  
  2734.                           else if (MANDChunk.Flags & THREE_BIT) COLORREMAP = ThreeRemap;
  2735.  
  2736.                                else if (MANDChunk.Flags & FOUR_BIT) COLORREMAP = FourRemap;
  2737.  
  2738.  INCREMREAL = (fabs (RMAX-RMIN)) / ((LDouble) (a2 - a1 + 1));
  2739.  
  2740.  INCREMIMAG = (fabs (IMAX-IMIN)) / ((LDouble) (b2 - b1 + 1));
  2741.  
  2742.  (*H_LINE) (Win->RPort,a1,a2,b1);
  2743.  
  2744.  (*V_LINE) (Win->RPort,b1+1,b2-1,a2);
  2745.  
  2746.  (*H_LINE) (Win->RPort,a1,a2,b2);
  2747.  
  2748.  (*V_LINE) (Win->RPort,b1+1,b2-1,a1);
  2749.  
  2750.  RectangleDraw (Win,a1,b1,a2,b2);
  2751. }
  2752.  
  2753. ULONG DrawFractal (struct Window *Win,const WORD a1,const WORD b1,const WORD a2,const WORD b2, BOOL BeepWhenReady)
  2754. {
  2755. ULONG StartSec = NULL , EndSec = NULL , Dummy = NULL;
  2756.  
  2757.  CurrentTime (&StartSec,&Dummy);
  2758.  
  2759.  if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  2760.  
  2761.  if (MANDChunk.Flags & PPC_BIT)
  2762.  {
  2763.     MANDChunk.LeftEdge = a1;
  2764.  
  2765.     MANDChunk.TopEdge = b1;
  2766.  
  2767.     MANDChunk.Width = a2-1;
  2768.  
  2769.     MANDChunk.Height = b2-1;
  2770.  
  2771.     MANDChunk.RMin = RMIN;
  2772.  
  2773.     MANDChunk.RMax = RMAX;
  2774.  
  2775.     MANDChunk.IMin = IMIN;
  2776.  
  2777.     MANDChunk.IMax = IMAX;
  2778.  
  2779.     MANDChunk.JKre = JKRE;
  2780.  
  2781.     MANDChunk.JKim = JKIM;
  2782.  
  2783.     MANDChunk.Iterations = MAX_ITERATIONS;
  2784.  
  2785.     MANDChunk.Colors = COLORS;
  2786.  
  2787.     MANDChunk.Modulo = a2 - a1 + Win->BorderLeft + Win->BorderRight;
  2788.  
  2789.     CalcFractalPPC (&MANDChunk,GfxPpcMem);
  2790.  
  2791.     WriteChunkyPixels (Win->RPort,MANDChunk.LeftEdge,MANDChunk.TopEdge,MANDChunk.Width,MANDChunk.Height,GfxPpcMem,MANDChunk.Modulo);
  2792.  }
  2793.  
  2794.  if (MANDChunk.Flags & MC68K_BIT) CalcFractal (Win,a1,b1,a2-1,b2-1);
  2795.  
  2796.  if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  2797.  
  2798.  CurrentTime (&EndSec,&Dummy);
  2799.  
  2800.  if (BeepWhenReady == TRUE) DisplayBeep (Win->WScreen);
  2801.  
  2802.  return (EndSec-StartSec);
  2803. }
  2804.  
  2805. BOOL Preview (struct Window *Win,LONG Width,LONG Height)
  2806. {
  2807. struct Window *PreviewWin;
  2808.  
  2809. struct IntuiMessage *Message;
  2810.  
  2811. BOOL Error = FALSE;
  2812.  
  2813. UWORD MyCode;
  2814.  
  2815. ULONG MyClass;
  2816.  
  2817.  MYBITMAP = CopyBitMap (Win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2818.  
  2819.  PreviewWin = OpenWindowTags (0,WA_Left,Win->LeftEdge + 25,
  2820.                                 WA_Top,Win->TopEdge + 35,
  2821.                                 WA_Width,Width  / 2,
  2822.                                 WA_Height,Height / 2,
  2823.                                 WA_Title, CATSTR(TXT_PreviewTitle),
  2824.                                 WA_ScreenTitle,"¼ Window preview...",
  2825.                                 WA_CustomScreen,Win->WScreen,
  2826.                                 WA_IDCMP,IDCMP_RAWKEY|IDCMP_CLOSEWINDOW,
  2827.                                 WA_Flags,WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DRAGBAR|WFLG_NOCAREREFRESH|WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_GIMMEZEROZERO,
  2828.                                 WA_BusyPointer,TRUE,
  2829.                                 TAG_END);
  2830.  if (PreviewWin)
  2831.  {
  2832.     PasteBitMap (MYBITMAP,PreviewWin,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  2833.  
  2834.     PutPointer (PreviewWin,0,0,0,0,0,BUSY_POINTER);
  2835.  
  2836.     ELAPSEDTIME = DrawFractal (PreviewWin,0,0,PreviewWin->GZZWidth,PreviewWin->GZZHeight,TRUE);
  2837.  
  2838.     PutPointer (PreviewWin,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  2839.  
  2840.     ShowTime (PreviewWin, CATSTR(TXT_PreviewTime),ELAPSEDTIME);
  2841.  
  2842.     while (1L)
  2843.     {
  2844.          WaitPort (PreviewWin->UserPort);
  2845.  
  2846.          if (Message = (struct IntuiMessage *) GT_GetIMsg (PreviewWin->UserPort))
  2847.          {
  2848.             MyClass = Message->Class;
  2849.  
  2850.             MyCode  = Message->Code;
  2851.  
  2852.             GT_ReplyIMsg ((struct IntuiMessage *) Message);
  2853.  
  2854.             if (MyClass == IDCMP_CLOSEWINDOW) break;
  2855.  
  2856.             if ((MyClass == IDCMP_RAWKEY) && (MyCode == RAW_ESC)) break;
  2857.          }
  2858.     }
  2859.  
  2860.     PutPointer (PreviewWin,0,0,0,0,0,CLEAR_POINTER);
  2861.  
  2862.     CloseWindow (PreviewWin);
  2863.  }
  2864.  
  2865.  else
  2866.  {
  2867.     if (BMASK & MASK)
  2868.     {
  2869.        FreeBitMapSafety (MYBITMAP);
  2870.  
  2871.        MASK &= ~BMASK;
  2872.     }
  2873.  
  2874.     DisplayError(Win, TXT_ERR_PreviewWindow, 15L);
  2875.  
  2876.     Error = TRUE;
  2877.  }
  2878.  
  2879.  return Error;
  2880. }
  2881.  
  2882. BOOL DrawFrame (struct Window *Win,const WORD Zx,const WORD Zy,const WORD Zw,const WORD Zh)
  2883. {
  2884. WORD LeftEdge,TopEdge,RightEdge,BottomEdge;
  2885.  
  2886.   if ((Zx > 2) && (Zy > 2) && (Zx < Win->Width - 2) && (Zy < Win->Height - 2) && ((Zw >= INITIALZOOM) || (Zh >= INITIALZOOM)))
  2887.   {
  2888.      LeftEdge   = Zx - Zw;
  2889.  
  2890.      TopEdge    = Zy - Zh;
  2891.  
  2892.      RightEdge  = Zx + Zw;
  2893.  
  2894.      BottomEdge = Zy + Zh;
  2895.  
  2896.      if ((LeftEdge >= 0) && (TopEdge >= 0) && (RightEdge <= Win->Width) && (BottomEdge <= Win->Height))
  2897.      {
  2898.         ZOOMLINE [8] = ZOOMLINE [0] = ZOOMLINE [6] = LeftEdge;
  2899.  
  2900.         ZOOMLINE [1] = ZOOMLINE [3] = ZOOMLINE [9] = TopEdge;
  2901.  
  2902.         ZOOMLINE [2] = ZOOMLINE [4] = RightEdge;
  2903.  
  2904.         ZOOMLINE [5] = ZOOMLINE [7] = BottomEdge;
  2905.      }
  2906.  
  2907.      DrawBorder (Win->RPort,&MYBORDER,0,0);
  2908.  
  2909.      MASK |= ZMASK;
  2910.   }
  2911.  
  2912.   else MASK &= ~ZMASK;
  2913.  
  2914.   return (BOOL) (ZMASK & MASK);
  2915. }
  2916.  
  2917. BOOL FileRequest (struct Window *Win,TEXT *String,TEXT *DrawerTxt,BOOL DrawerType,BOOL Save)
  2918. {
  2919. struct FileRequester *MyFileReq;
  2920.  
  2921. struct EasyStruct MyReq = { sizeof (struct EasyStruct),0,CATSTR(TITLE_OverwriteReq),CATSTR(OverWr_TXT_Question),CATSTR(TXT_YesNo)};
  2922.  
  2923. BPTR MyLock;
  2924.  
  2925. BOOL Success = FALSE;
  2926.  
  2927.   if (MyFileReq = AllocAslRequest (ASL_FileRequest,0))
  2928.   {
  2929.      MYDIR = (DrawerType ? PALETTESDIR : PICTURESDIR);
  2930.  
  2931.      if (! strlen (MYDIR)) strncpy (MYDIR,DrawerTxt,MAX_DIRLEN);
  2932.  
  2933.      if (AslRequestTags (MyFileReq,ASLFR_Window,Win,
  2934.                                    ASLFR_InitialLeftEdge,Win->LeftEdge + 25,
  2935.                                    ASLFR_InitialTopEdge,Win->TopEdge + 35,
  2936.                                    ASLFR_InitialWidth,300,
  2937.                                    ASLFR_InitialHeight,((Win->Height) * 7) >> 3,
  2938.                                    ASLFR_SleepWindow,TRUE,
  2939.                                    ASLFR_TextAttr,&MYFONTSTRUCT,
  2940.                                    ASLFR_TitleText,String,
  2941.                                    ASLFR_InitialDrawer,MYDIR,
  2942.                                    ASLFR_InitialFile,MYFILE,
  2943.                                    ASLFR_DoSaveMode,Save,
  2944.                                    ASLFR_RejectIcons,TRUE,
  2945.                                    TAG_END))
  2946.      {
  2947.         strncpy (MYFILE,MyFileReq->rf_File,MAX_FILELEN);
  2948.  
  2949.         strncpy (MYDIR,MyFileReq->rf_Dir,MAX_DIRLEN);
  2950.  
  2951.         strcpy (MYPATH,MYDIR);
  2952.  
  2953.         Success = AddPart (MYPATH,MYFILE,sizeof (MYPATH));
  2954.      }
  2955.  
  2956.      FreeAslRequest (MyFileReq);
  2957.  
  2958.      if (Save && Success)
  2959.      {
  2960.         if (MyLock = Lock (MYPATH,ACCESS_READ))
  2961.         {
  2962.            UnLock (MyLock);
  2963.  
  2964.            if (ResourceBase)
  2965.            {
  2966.               if (! Do_OverwriteRequest (Win, FMSCREENNAME, 0, 0)) Success = FALSE;
  2967.            }
  2968.  
  2969.            else
  2970.            {
  2971.               if (! EasyRequest (Win,&MyReq,0)) Success = FALSE;
  2972.            }
  2973.         }
  2974.      }
  2975.   }
  2976.  
  2977.   return Success;
  2978. }
  2979.  
  2980. BOOL FontRequest (struct Window *Win)
  2981. {
  2982. struct FontRequester *MyFontReq;
  2983.  
  2984. BOOL Success = FALSE;
  2985.  
  2986.   if (MyFontReq = AllocAslRequest (ASL_FontRequest,0))
  2987.   {
  2988.      if (AslRequestTags (MyFontReq,ASLFO_Window,Win,
  2989.                                    ASLFO_InitialLeftEdge,Win->LeftEdge + 25,
  2990.                                    ASLFO_InitialTopEdge,Win->TopEdge + 35,
  2991.                                    ASLFO_InitialWidth,300,
  2992.                                    ASLFO_InitialHeight,((Win->Height) * 7) >> 3,
  2993.                                    ASLFO_SleepWindow,TRUE,
  2994.                                    ASLFO_TextAttr,&MYFONTSTRUCT,
  2995.                                    ASLFO_TitleText,"Font requester",
  2996.                                    ASLFO_InitialName,MYFONTSTRUCT.ta_Name,
  2997.                                    ASLFO_InitialSize,MYFONTSTRUCT.ta_YSize,
  2998.                                    ASLFO_InitialStyle,MYFONTSTRUCT.ta_Style,
  2999.                                    ASLFO_InitialFlags,MYFONTSTRUCT.ta_Flags,
  3000.                                    ASLFO_DoFrontPen,TRUE,
  3001.                                    ASLFO_DoBackPen,TRUE,
  3002.                                    ASLFO_DoStyle,TRUE,
  3003.                                    ASLFO_DoDrawMode,TRUE,
  3004.                                    ASLFO_MinHeight,8,
  3005.                                    ASLFO_MaxHeight,24,
  3006.                                    TAG_END))
  3007.      {
  3008.        strncpy (MYFONTSTRUCT.ta_Name,MyFontReq->fo_Attr.ta_Name,MAX_FILELEN);
  3009.  
  3010.        MYFONTSTRUCT.ta_YSize = MyFontReq->fo_Attr.ta_YSize;
  3011.  
  3012.        MYFONTSTRUCT.ta_Style = MyFontReq->fo_Attr.ta_Style;
  3013.  
  3014.        MYFONTSTRUCT.ta_Flags = MyFontReq->fo_Attr.ta_Flags;
  3015.  
  3016.        Success = TRUE;
  3017.      }
  3018.  
  3019.      FreeAslRequest (MyFontReq);
  3020.   }
  3021.  
  3022.   return Success;
  3023. }
  3024.  
  3025. static ULONG HOOKCALL SMFilterFunc (REG (a0,struct Hook *Hook),REG (a2,struct ScreenModeRequester *SMReq),REG (a1,ULONG DisplayID))
  3026. {
  3027. DisplayInfoHandle DisplayHandle;
  3028.  
  3029. struct DisplayInfo DisplayInfo;
  3030.  
  3031. struct DimensionInfo DimensionInfo;
  3032.  
  3033. ULONG Accept = NULL;
  3034.  
  3035.   DisplayHandle = FindDisplayInfo (DisplayID);
  3036.  
  3037.   if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DisplayInfo,sizeof (struct DisplayInfo),DTAG_DISP,DisplayID))
  3038.   {
  3039.      if (GetDisplayInfoData (DisplayHandle,(UBYTE *) &DimensionInfo,sizeof (struct DimensionInfo),DTAG_DIMS,DisplayID))
  3040.      {
  3041.         Accept = (ULONG) ((DimensionInfo.MaxDepth <= MAX_DEPTH) && (DisplayInfo.PropertyFlags & DIPF_IS_WB));
  3042.      }
  3043.   }
  3044.  
  3045.   return Accept;
  3046. }
  3047.  
  3048. BOOL SMRequest (struct ILBMInfo *Ilbm)
  3049. {
  3050. struct ScreenModeRequester *SMReq;
  3051.  
  3052. struct Window *Win = Ilbm->win;
  3053.  
  3054. BOOL NewScreen = FALSE;
  3055.  
  3056.  if (SMReq = AllocAslRequest (ASL_ScreenModeRequest,NULL))
  3057.  {
  3058.     if (AslRequestTags (SMReq,ASLSM_Window,Win,
  3059.                               ASLSM_SleepWindow,TRUE,
  3060.                               ASLSM_TitleText,"ScreenMode requester",
  3061.                               ASLSM_InitialLeftEdge,Win->LeftEdge + 25,
  3062.                               ASLSM_InitialTopEdge,Win->TopEdge + 35,
  3063.                               ASLSM_InitialWidth,310,
  3064.                               ASLSM_InitialHeight,((Win->Height) * 7) >> 3,
  3065.                               ASLSM_InitialDisplayID,GetVPModeID (Ilbm->vp),
  3066.                               ASLSM_InitialDisplayWidth,Win->Width,
  3067.                               ASLSM_InitialDisplayHeight,Win->Height,
  3068.                               ASLSM_InitialDisplayDepth,Ilbm->wrp->BitMap->Depth,
  3069.                               ASLSM_InitialOverscanType,Ilbm->ucliptype,
  3070.                               ASLSM_InitialInfoOpened,TRUE,
  3071.                               ASLSM_InitialInfoLeftEdge,Win->LeftEdge + 310 + 15,
  3072.                               ASLSM_InitialInfoTopEdge,Win->TopEdge,
  3073.                               ASLSM_DoWidth,TRUE,
  3074.                               ASLSM_DoHeight,TRUE,
  3075.                               ASLSM_DoDepth,TRUE,
  3076.                               ASLSM_DoOverscanType,TRUE,
  3077.                               ASLSM_MinDepth,MIN_DEPTH,
  3078.                               ASLSM_MaxDepth,MAX_DEPTH,
  3079.                               ASLSM_PropertyFlags,DIPF_IS_WB,
  3080.                               ASLSM_PropertyMask,DIPF_IS_DUALPF|DIPF_IS_PF2PRI|DIPF_IS_HAM|DIPF_IS_EXTRAHALFBRITE,
  3081.                               ASLSM_FilterFunc,&SMFILTERHOOK,
  3082.                               ASLSM_MinWidth,MIN_WIDTH,
  3083.                               ASLSM_MinHeight,MIN_HEIGHT,
  3084.                               TAG_END))
  3085.     {
  3086.        Ilbm->camg = SMReq->sm_DisplayID;
  3087.  
  3088.        Ilbm->Bmhd.w = SMReq->sm_DisplayWidth;
  3089.  
  3090.        Ilbm->Bmhd.h = SMReq->sm_DisplayHeight;
  3091.  
  3092.        Ilbm->Bmhd.nPlanes = SMReq->sm_DisplayDepth;
  3093.  
  3094.        Ilbm->ucliptype = SMReq->sm_OverscanType;
  3095.  
  3096.        NewScreen = TRUE;
  3097.     }
  3098.  
  3099.     FreeAslRequest (SMReq);
  3100.  }
  3101.  
  3102.  return NewScreen;
  3103. }
  3104.  
  3105. VOID SetMenuStart (struct Window *Win)
  3106. {
  3107.   OnMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  3108.  
  3109.   OnMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  3110.  
  3111.   OnMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  3112.  
  3113.   OnMenu  (Win,FULLMENUNUM (0,6,NOSUB));
  3114.  
  3115.   OnMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  3116.  
  3117.   OnMenu  (Win,FULLMENUNUM (0,8,NOSUB));
  3118.  
  3119.   OnMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  3120.  
  3121.   OnMenu  (Win,FULLMENUNUM (0,11,NOSUB));
  3122.  
  3123.   OnMenu  (Win,FULLMENUNUM (0,13,NOSUB));
  3124.  
  3125.   OnMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  3126.  
  3127.   OnMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  3128.  
  3129.   OnMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  3130.  
  3131.   OnMenu  (Win,FULLMENUNUM (1,3,NOSUB));
  3132.  
  3133.   OnMenu  (Win,FULLMENUNUM (1,5,NOSUB));
  3134.  
  3135.   OnMenu  (Win,FULLMENUNUM (1,6,NOSUB));
  3136.  
  3137.   OnMenu  (Win,FULLMENUNUM (1,7,NOSUB));
  3138.  
  3139.   OnMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  3140.  
  3141.   OffMenu (Win,FULLMENUNUM (2,7,NOSUB));
  3142.  
  3143.   OnMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  3144.  
  3145.   OnMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  3146.  
  3147.   OnMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  3148.  
  3149.   OnMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  3150. }
  3151.  
  3152. VOID SetMenuStop (struct Window *Win)
  3153. {
  3154.   OffMenu  (Win,FULLMENUNUM (0,0,NOSUB));
  3155.  
  3156.   OffMenu  (Win,FULLMENUNUM (0,2,NOSUB));
  3157.  
  3158.   OffMenu  (Win,FULLMENUNUM (0,4,NOSUB));
  3159.  
  3160.   OffMenu  (Win,FULLMENUNUM (0,6,NOSUB));
  3161.  
  3162.   OffMenu  (Win,FULLMENUNUM (0,7,NOSUB));
  3163.  
  3164.   OffMenu  (Win,FULLMENUNUM (0,8,NOSUB));
  3165.  
  3166.   OffMenu  (Win,FULLMENUNUM (0,9,NOSUB));
  3167.  
  3168.   OffMenu  (Win,FULLMENUNUM (0,11,NOSUB));
  3169.  
  3170.   OffMenu  (Win,FULLMENUNUM (0,13,NOSUB));
  3171.  
  3172.   OffMenu  (Win,FULLMENUNUM (1,0,NOSUB));
  3173.  
  3174.   OffMenu  (Win,FULLMENUNUM (1,1,NOSUB));
  3175.  
  3176.   OffMenu  (Win,FULLMENUNUM (1,2,NOSUB));
  3177.  
  3178.   OffMenu  (Win,FULLMENUNUM (1,3,NOSUB));
  3179.  
  3180.   OffMenu  (Win,FULLMENUNUM (1,5,NOSUB));
  3181.  
  3182.   OffMenu  (Win,FULLMENUNUM (1,6,NOSUB));
  3183.  
  3184.   OffMenu  (Win,FULLMENUNUM (1,7,NOSUB));
  3185.  
  3186.   OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3187.  
  3188.   OffMenu  (Win,FULLMENUNUM (2,2,NOSUB));
  3189.  
  3190.   OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3191.  
  3192.   OnMenu   (Win,FULLMENUNUM (2,7,NOSUB));
  3193.  
  3194.   OffMenu  (Win,FULLMENUNUM (3,0,NOSUB));
  3195.  
  3196.   OffMenu  (Win,FULLMENUNUM (3,2,NOSUB));
  3197.  
  3198.   OffMenu  (Win,FULLMENUNUM (3,4,NOSUB));
  3199.  
  3200.   OffMenu  (Win,FULLMENUNUM (3,6,NOSUB));
  3201. }
  3202.  
  3203. ULONG ProcessMenu (struct Window *Win,UWORD Code)
  3204. {
  3205. struct MenuItem *Item;
  3206.  
  3207. ULONG Choice = NULL;
  3208.  
  3209.  while (Code != MENUNULL)
  3210.  {
  3211.   Item = ItemAddress (MAINMENU,(ULONG) Code);
  3212.  
  3213.   switch (MENUNUM (Code))
  3214.   {
  3215.         case 0:    switch (ITEMNUM (Code))
  3216.                    {
  3217.                         case 0: Choice |= ABOUT_MSG;
  3218.  
  3219.                                 break;
  3220.  
  3221.                         case 2: Choice |= SYSINFO_MSG;
  3222.  
  3223.                                 break;
  3224.  
  3225.                         case 4: Choice |= SHOWGUIDE_MSG;
  3226.  
  3227.                                 break;
  3228.  
  3229.                         case 6: Choice |= LOADPICTURE_MSG;
  3230.  
  3231.                                 break;
  3232.  
  3233.                         case 7: Choice |= SAVEPICTURE_MSG;
  3234.  
  3235.                                 break;
  3236.  
  3237.                         case 8: Choice |= LOADPALETTE_MSG;
  3238.  
  3239.                                 break;
  3240.  
  3241.                         case 9: Choice |= SAVEPALETTE_MSG;
  3242.  
  3243.                                 break;
  3244.  
  3245.                         case 11: Choice |= DUMP_MSG;
  3246.  
  3247.                                 break;
  3248.  
  3249.                         case 13: Choice |= EXIT_MSG;
  3250.  
  3251.                                 break;
  3252.                    }
  3253.  
  3254.                    break;
  3255.  
  3256.         case 1:    switch (ITEMNUM (Code))
  3257.                    {
  3258.                         case 0: switch (SUBNUM (Code))
  3259.                                 {
  3260.                                    case 0: Choice |= TITLE_MSG;
  3261.  
  3262.                                            break;
  3263.  
  3264.                                    case 2: Choice |= TIME_MSG;
  3265.  
  3266.                                            break;
  3267.                                 }
  3268.  
  3269.                                 break;
  3270.  
  3271.                         case 1: Choice |= COORDS_MSG;
  3272.  
  3273.                                 break;
  3274.  
  3275.                         case 2: switch (SUBNUM (Code))
  3276.                                 {
  3277.                                    case 0: MAX_ITERATIONS = 256;
  3278.  
  3279.                                            break;
  3280.  
  3281.                                    case 1: MAX_ITERATIONS = 320;
  3282.  
  3283.                                            break;
  3284.  
  3285.                                    case 2: MAX_ITERATIONS = 512;
  3286.  
  3287.                                            break;
  3288.  
  3289.                                    case 3: MAX_ITERATIONS = 1024;
  3290.  
  3291.                                            break;
  3292.  
  3293.                                    case 4: MAX_ITERATIONS = 2048;
  3294.  
  3295.                                            break;
  3296.  
  3297.                                    case 5: MAX_ITERATIONS = 4096;
  3298.  
  3299.                                            break;
  3300.  
  3301.                                    case 6: MAX_ITERATIONS = 8192;
  3302.  
  3303.                                            break;
  3304.  
  3305.                                    case 7: MAX_ITERATIONS = 16384;
  3306.  
  3307.                                            break;
  3308.  
  3309.                                    case 8: MAX_ITERATIONS = 32767;
  3310.  
  3311.                                            break;
  3312.  
  3313.                                   case 10: Choice |= ITER_MSG;
  3314.  
  3315.                                            break;
  3316.                                 }
  3317.  
  3318.                                 break;
  3319.  
  3320.                         case 3: switch (SUBNUM (Code))
  3321.                                 {
  3322.                                    case 0: MANDChunk.Power = 0;
  3323.  
  3324.                                            break;
  3325.  
  3326.                                    case 1: MANDChunk.Power = 1;
  3327.  
  3328.                                            break;
  3329.  
  3330.                                    case 2: MANDChunk.Power = 2;
  3331.  
  3332.                                            break;
  3333.  
  3334.                                    case 3: MANDChunk.Power = 3;
  3335.  
  3336.                                            break;
  3337.  
  3338.                                    case 4: MANDChunk.Power = 4;
  3339.  
  3340.                                            break;
  3341.  
  3342.                                    case 5: MANDChunk.Power = 5;
  3343.  
  3344.                                            break;
  3345.  
  3346.                                    case 6: MANDChunk.Power = 6;
  3347.  
  3348.                                            break;
  3349.  
  3350.                                    case 7: MANDChunk.Power = 7;
  3351.  
  3352.                                            break;
  3353.  
  3354.                                    case 8: MANDChunk.Power = 8;
  3355.  
  3356.                                            break;
  3357.  
  3358.                                    case 9: MANDChunk.Power = 9;
  3359.  
  3360.                                            break;
  3361.  
  3362.                                   case 10: MANDChunk.Power = 10;
  3363.  
  3364.                                            break;
  3365.                                 }
  3366.  
  3367.                                 break;
  3368.  
  3369.                         case 4: switch (SUBNUM (Code))
  3370.                                 {
  3371.                                    case  0: PRIORITY = -5;
  3372.  
  3373.                                             break;
  3374.  
  3375.                                    case  1: PRIORITY = -4;
  3376.  
  3377.                                             break;
  3378.  
  3379.                                    case  2: PRIORITY = -3;
  3380.  
  3381.                                             break;
  3382.  
  3383.                                    case  3: PRIORITY = -2;
  3384.  
  3385.                                             break;
  3386.  
  3387.                                    case  4: PRIORITY = -1;
  3388.  
  3389.                                             break;
  3390.  
  3391.                                    case  6: PRIORITY =  0;
  3392.  
  3393.                                             break;
  3394.  
  3395.                                    case  8: PRIORITY =  1;
  3396.  
  3397.                                             break;
  3398.  
  3399.                                    case  9: PRIORITY =  2;
  3400.  
  3401.                                             break;
  3402.  
  3403.                                    case 10: PRIORITY =  3;
  3404.  
  3405.                                             break;
  3406.  
  3407.                                    case 11: PRIORITY =  4;
  3408.  
  3409.                                             break;
  3410.  
  3411.                                    case 12: PRIORITY =  5;
  3412.  
  3413.                                             break;
  3414.  
  3415.                                 }
  3416.  
  3417.                                 Forbid ();
  3418.  
  3419.                                 THISTASK = FindTask (NULL);
  3420.  
  3421.                                 Permit ();
  3422.  
  3423.                                 SetTaskPri (THISTASK,PRIORITY);
  3424.  
  3425.                                 break;
  3426.  
  3427.                         case 5: switch (SUBNUM (Code))
  3428.                                 {
  3429.                                    case 0: if (! (MANDChunk.Flags & LINEAR_BIT))
  3430.                                            {
  3431.                                               SaveCoords (Win,TRUE);
  3432.  
  3433.                                               MANDChunk.Flags |= LINEAR_BIT;
  3434.  
  3435.                                               MANDChunk.Flags &= ~(SQUARE_BIT|REPEATED_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3436.                                            }
  3437.  
  3438.                                            break;
  3439.  
  3440.                                    case 1: if (! (MANDChunk.Flags & LOG_BIT))
  3441.                                            {
  3442.                                               SaveCoords (Win,TRUE);
  3443.  
  3444.                                               MANDChunk.Flags |= LOG_BIT;
  3445.  
  3446.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3447.                                            }
  3448.  
  3449.                                            break;
  3450.  
  3451.                                    case 2: if (! (MANDChunk.Flags & REPEATED_BIT))
  3452.                                            {
  3453.                                               SaveCoords (Win,TRUE);
  3454.  
  3455.                                               MANDChunk.Flags |= REPEATED_BIT;
  3456.  
  3457.                                               MANDChunk.Flags &= ~(LINEAR_BIT|SQUARE_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3458.                                            }
  3459.  
  3460.                                            break;
  3461.  
  3462.                                    case 3: if (! (MANDChunk.Flags & SQUARE_BIT))
  3463.                                            {
  3464.                                               SaveCoords (Win,TRUE);
  3465.  
  3466.                                               MANDChunk.Flags |= SQUARE_BIT;
  3467.  
  3468.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|ONE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3469.                                            }
  3470.  
  3471.                                            break;
  3472.  
  3473.                                    case 4: if (! (MANDChunk.Flags & ONE_BIT))
  3474.                                            {
  3475.                                               SaveCoords (Win,TRUE);
  3476.  
  3477.                                               MANDChunk.Flags |= ONE_BIT;
  3478.  
  3479.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|TWO_BIT|THREE_BIT|FOUR_BIT);
  3480.                                            }
  3481.  
  3482.                                            break;
  3483.  
  3484.                                    case 5: if (! (MANDChunk.Flags & TWO_BIT))
  3485.                                            {
  3486.                                               SaveCoords (Win,TRUE);
  3487.  
  3488.                                               MANDChunk.Flags |= TWO_BIT;
  3489.  
  3490.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|THREE_BIT|FOUR_BIT);
  3491.                                            }
  3492.  
  3493.                                            break;
  3494.  
  3495.                                    case 6: if (! (MANDChunk.Flags & THREE_BIT))
  3496.                                            {
  3497.                                               SaveCoords (Win,TRUE);
  3498.  
  3499.                                               MANDChunk.Flags |= THREE_BIT;
  3500.  
  3501.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|FOUR_BIT);
  3502.                                            }
  3503.  
  3504.                                            break;
  3505.  
  3506.                                    case 7: if (! (MANDChunk.Flags & FOUR_BIT))
  3507.                                            {
  3508.                                               SaveCoords (Win,TRUE);
  3509.  
  3510.                                               MANDChunk.Flags |= FOUR_BIT;
  3511.  
  3512.                                               MANDChunk.Flags &= ~(LINEAR_BIT|REPEATED_BIT|LOG_BIT|SQUARE_BIT|ONE_BIT|TWO_BIT|THREE_BIT);
  3513.                                            }
  3514.  
  3515.                                            break;
  3516.                                 }
  3517.  
  3518.                                 break;
  3519.  
  3520.                         case 6: switch (SUBNUM (Code))
  3521.                                 {
  3522.                                    case 0: if (! (MANDChunk.Flags & JULIA_BIT))
  3523.                                            {
  3524.                                               if (PickJuliaK (Win))
  3525.                                               {
  3526.                                                  SaveCoords (Win,TRUE);
  3527.  
  3528.                                                  MANDChunk.Flags |= JULIA_BIT;
  3529.  
  3530.                                                  MANDChunk.Flags &= ~(MANDEL_BIT|JULIA4_BIT|MANDEL4_BIT);
  3531.  
  3532.                                                  Choice |= REDRAW_MSG;
  3533.                                               }
  3534.                                            }
  3535.  
  3536.                                            break;
  3537.  
  3538.                                    case 1: if (! (MANDChunk.Flags & MANDEL_BIT))
  3539.                                            {
  3540.                                               SaveCoords (Win,TRUE);
  3541.  
  3542.                                               MANDChunk.Flags |= MANDEL_BIT;
  3543.  
  3544.                                               MANDChunk.Flags &= ~(JULIA_BIT|JULIA4_BIT|MANDEL4_BIT);
  3545.  
  3546.                                               RMIN = DEF_RMIN;
  3547.  
  3548.                                               RMAX = DEF_RMAX;
  3549.  
  3550.                                               IMIN = DEF_IMIN;
  3551.  
  3552.                                               IMAX = DEF_IMAX;
  3553.  
  3554.                                               Choice |= REDRAW_MSG;
  3555.                                            }
  3556.  
  3557.                                            break;
  3558.                                 }
  3559.  
  3560.                                 break;
  3561.  
  3562.                         case 7: switch (SUBNUM (Code))
  3563.                                 {
  3564.                                    case 0: MANDChunk.Flags |= MC68K_BIT;
  3565.  
  3566.                                            MANDChunk.Flags &= ~PPC_BIT;
  3567.  
  3568.                                            break;
  3569.  
  3570.                                    case 1: MANDChunk.Flags |= PPC_BIT;
  3571.  
  3572.                                            MANDChunk.Flags &= ~MC68K_BIT;
  3573.  
  3574.                                            break;
  3575.                                 }
  3576.                    }
  3577.  
  3578.                    break;
  3579.  
  3580.         case 2: switch (ITEMNUM (Code))
  3581.                 {
  3582.                    case 0: Choice |= PREVIEW_MSG;
  3583.  
  3584.                            break;
  3585.  
  3586.                    case 2: Choice |= REDRAW_MSG;
  3587.  
  3588.                            break;
  3589.  
  3590.                    case 4: Choice |= (UNDO_MSG|REDRAW_MSG);
  3591.  
  3592.                            break;
  3593.  
  3594.                    case 6: Choice |= DRAW_MSG;
  3595.  
  3596.                            break;
  3597.  
  3598.                    case 7: Choice |= STOP_MSG;
  3599.  
  3600.                            break;
  3601.                 }
  3602.  
  3603.                 break;
  3604.  
  3605.         case 3: switch (ITEMNUM (Code))
  3606.                 {
  3607.                    case 0: switch (SUBNUM (Code))
  3608.                            {
  3609.                               case 0: Choice |= CYCLERIGHT_MSG;
  3610.  
  3611.                                       break;
  3612.  
  3613.                               case 1: Choice |= CYCLELEFT_MSG;
  3614.  
  3615.                                       break;
  3616.  
  3617.                               case 3: Choice |= DELAY_MSG;
  3618.  
  3619.                                       break;
  3620.  
  3621.                            }
  3622.  
  3623.                            break;
  3624.  
  3625.                    case 2: Choice |= PALETTE_MSG;
  3626.  
  3627.                            break;
  3628.  
  3629.                    case 4: Choice |= NEWDISPLAY_MSG;
  3630.  
  3631.                            break;
  3632.  
  3633.                    case 6: Choice |= FONTREQ_MSG;
  3634.  
  3635.                            break;
  3636.                 }
  3637.  
  3638.         case 4: Choice |= AREXX_MSG;
  3639.   }
  3640.  
  3641.  Code = Item->NextSelect;
  3642.  }
  3643.  
  3644.  return Choice;
  3645. }
  3646.  
  3647. void CheckMenu (struct Window *Win)
  3648. {
  3649. UWORD Index;
  3650.  
  3651.  ClearMenuStrip (Win);
  3652.  
  3653.  for (Index = 0; Index <= 10; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,3,Index))->Flags &= ~CHECKED;
  3654.  
  3655.  ItemAddress (MAINMENU,FULLMENUNUM (1,3,MANDChunk.Power))->Flags |= CHECKED;
  3656.  
  3657.  for (Index = 0; Index <= 7; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,5,Index))->Flags &= ~CHECKED;
  3658.  
  3659.  if (MANDChunk.Flags & LINEAR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,0))->Flags |= CHECKED;
  3660.  
  3661.  else if (MANDChunk.Flags & LOG_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,1))->Flags |= CHECKED;
  3662.  
  3663.       else if (MANDChunk.Flags & REPEATED_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,2))->Flags |= CHECKED;
  3664.  
  3665.            else if (MANDChunk.Flags & SQUARE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,3))->Flags |= CHECKED;
  3666.  
  3667.                 else if (MANDChunk.Flags & ONE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,4))->Flags |= CHECKED;
  3668.  
  3669.                      else if (MANDChunk.Flags & TWO_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,5))->Flags |= CHECKED;
  3670.  
  3671.                           else if (MANDChunk.Flags & THREE_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,6))->Flags |= CHECKED;
  3672.  
  3673.                                else if (MANDChunk.Flags & FOUR_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,5,7))->Flags |= CHECKED;
  3674.  
  3675.  for (Index = 0; Index <= 1; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,6,Index))->Flags &= ~CHECKED;
  3676.  
  3677.  if (MANDChunk.Flags & JULIA_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags |= CHECKED;
  3678.  
  3679.  else if (MANDChunk.Flags & MANDEL_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED;
  3680.  
  3681.  for (Index = 0; Index <= 1; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,7,Index))->Flags &= ~CHECKED;
  3682.  
  3683.  if ((MANDChunk.Flags & PPC_BIT) && (CPUINFO & (CPU_603|CPU_603e|CPU_604|CPU_604e|CPU_620|CPU_G3|CPU_G4|CPU_G5))) ItemAddress (MAINMENU,FULLMENUNUM (1,7,1))->Flags |= CHECKED;
  3684.  
  3685.  else if (MANDChunk.Flags & PPC_BIT)
  3686.       {
  3687.          MANDChunk.Flags &= ~PPC_BIT;
  3688.  
  3689.          MANDChunk.Flags |= MC68K_BIT;
  3690.       }
  3691.  
  3692.  if (MANDChunk.Flags & MC68K_BIT) ItemAddress (MAINMENU,FULLMENUNUM (1,7,0))->Flags |= CHECKED;
  3693.  
  3694.  for (Index = 0; Index <= 10; Index++) ItemAddress (MAINMENU,FULLMENUNUM (1,2,Index))->Flags &= ~CHECKED;
  3695.  
  3696.  switch (MAX_ITERATIONS)
  3697.  {
  3698.    case 256 : ItemAddress (MAINMENU,FULLMENUNUM (1,2,0))->Flags |= CHECKED;
  3699.  
  3700.               break;
  3701.  
  3702.    case 320:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,1))->Flags |= CHECKED;
  3703.  
  3704.               break;
  3705.  
  3706.    case 512:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,2))->Flags |= CHECKED;
  3707.  
  3708.               break;
  3709.  
  3710.   case 1024:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,3))->Flags |= CHECKED;
  3711.  
  3712.               break;
  3713.  
  3714.   case 2048:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,4))->Flags |= CHECKED;
  3715.  
  3716.               break;
  3717.  
  3718.   case 4096:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,5))->Flags |= CHECKED;
  3719.  
  3720.               break;
  3721.  
  3722.   case 8192:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,6))->Flags |= CHECKED;
  3723.  
  3724.               break;
  3725.  
  3726.  case 16384:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,7))->Flags |= CHECKED;
  3727.  
  3728.               break;
  3729.  
  3730.  case 32767:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,8))->Flags |= CHECKED;
  3731.  
  3732.               break;
  3733.  
  3734.     default:  ItemAddress (MAINMENU,FULLMENUNUM (1,2,10))->Flags |= CHECKED;
  3735.  
  3736.               break;
  3737.  }
  3738.  
  3739.  ResetMenuStrip (Win,MAINMENU);
  3740. }
  3741.  
  3742. VOID ProcessMouse (struct Window *Win,WORD CurMouseX,WORD CurMouseY)
  3743. {
  3744. // static WORD MX1 = 0 , MY1 = 0 , MX2 = 0 , MY2 = 0, W = 0, H = 0;
  3745.  
  3746. struct IntuiMessage *Message;
  3747.  
  3748. UWORD MyCode;
  3749.  
  3750. LONG DefaultQueue;
  3751.  
  3752. ULONG MyClass;
  3753.  
  3754.    ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE);
  3755.  
  3756.    DefaultQueue = SetMouseQueue (Win,10);
  3757.  
  3758.    if (ZMASK & MASK) DrawFrame (Win,MX1,MY1,W,H);
  3759.  
  3760.    MX1 = CurMouseX;
  3761.  
  3762.    MY1 = CurMouseY;
  3763.  
  3764.    W = INITIALZOOM;
  3765.  
  3766.    H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width);
  3767.  
  3768.    DrawFrame (Win,MX1,MY1,W,H);
  3769.  
  3770.    while (1L)
  3771.    {
  3772.      WaitPort (Win->UserPort);
  3773.  
  3774.      if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  3775.      {
  3776.         MyClass = Message->Class;
  3777.  
  3778.         MyCode = Message->Code;
  3779.  
  3780.         MX2 = Message->MouseX;
  3781.  
  3782.         MY2 = Message->MouseY;
  3783.  
  3784.         GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3785.  
  3786.         if (MyClass == IDCMP_MOUSEMOVE)
  3787.         {
  3788.            DrawFrame (Win,MX1,MY1,W,H);
  3789.  
  3790.            W = abs (MX1 - MX2);
  3791.  
  3792.            H = abs (MY1 - MY2);
  3793.  
  3794.            if (W > H) (W = ScalerDiv ((LONG) H,(ULONG) Win->Width,(ULONG) Win->Height));
  3795.  
  3796.            else (H = ScalerDiv ((LONG) W,(ULONG) Win->Height,(ULONG) Win->Width));
  3797.  
  3798.            DrawFrame (Win,MX1,MY1,W,H);
  3799.         }
  3800.  
  3801.         else if ((MyClass == IDCMP_MOUSEBUTTONS) && (MyCode != SELECTDOWN)) break;
  3802.      }
  3803.    }
  3804.  
  3805.    SetMouseQueue (Win,(ULONG) DefaultQueue);
  3806.  
  3807.    ModifyIDCMP (Win,IDCMP_STANDARD);
  3808.  
  3809.    if (ZMASK & MASK)
  3810.    {
  3811.       OnMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3812.  
  3813.       OnMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3814.    }
  3815.  
  3816.    else
  3817.    {
  3818.       OffMenu  (Win,FULLMENUNUM (2,0,NOSUB));
  3819.  
  3820.       OffMenu  (Win,FULLMENUNUM (2,6,NOSUB));
  3821.    }
  3822. }
  3823.  
  3824. BOOL PickJuliaK (struct Window *Win)
  3825. {
  3826. struct IntuiMessage *Message;
  3827.  
  3828. BOOL Selected = FALSE, End = FALSE;
  3829.  
  3830. WORD MouseX = 0,MouseY = 0;
  3831.  
  3832. UWORD MyCode = 0;
  3833.  
  3834. ULONG MyClass = NULL;
  3835.  
  3836. LDouble RealCoord=0.0,ImagCoord=0.0;
  3837.  
  3838.  ModifyIDCMP (Win,IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE|IDCMP_MENUPICK);
  3839.  
  3840.  ClearMenuStrip (Win);
  3841.  
  3842.  SetWindowTitles (Win,(TEXT *) ~0, CATSTR(TXT_LeftButtonForJulia));
  3843.  
  3844.  Delay (TWOSECS);
  3845.  
  3846.  do { WaitPort (Win->UserPort);
  3847.  
  3848.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Win->UserPort))
  3849.       {
  3850.              MyClass = Message->Class;
  3851.  
  3852.              MyCode  = Message->Code;
  3853.  
  3854.              MouseX  = Message->MouseX;
  3855.  
  3856.              MouseY  = Message->MouseY;
  3857.  
  3858.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3859.       }
  3860.  
  3861.       switch (MyClass)
  3862.       {
  3863.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  3864.                                       {
  3865.                                          RealCoord = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Win->Width - 1));
  3866.  
  3867.                                          ImagCoord = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Win->Height - 1));
  3868.  
  3869.                                          sprintf (BAR_STRING, CATSTR(TXT_JuliaConstant),RealCoord,ImagCoord);
  3870.  
  3871.                                          WaitTOF ();
  3872.  
  3873.                                          SetWindowTitles (Win,(TEXT *) ~0,BAR_STRING);
  3874.                                       }
  3875.  
  3876.                                       break;
  3877.  
  3878.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN)
  3879.                                       {
  3880.                                          JKRE = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Win->Width - 1));
  3881.  
  3882.                                          JKIM = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Win->Height - 1));
  3883.  
  3884.                                          End = Selected = TRUE;
  3885.                                       }
  3886.  
  3887.                                       break;
  3888.  
  3889.              case     IDCMP_MENUPICK: End = TRUE;
  3890.  
  3891.                                       ItemAddress (MAINMENU,FULLMENUNUM (1,6,0))->Flags &= ~CHECKED;
  3892.  
  3893.                                       ItemAddress (MAINMENU,FULLMENUNUM (1,6,1))->Flags |= CHECKED;
  3894.  
  3895.                                       break;
  3896.       }
  3897.  
  3898.     } while (End != TRUE);
  3899.  
  3900.   ResetMenuStrip (Win,MAINMENU);
  3901.  
  3902.   ModifyIDCMP (Win,IDCMP_STANDARD);
  3903.  
  3904.   return (Selected);
  3905. }
  3906.  
  3907. ULONG HandleEvents (struct ILBMInfo *Ilbm)
  3908. {
  3909. struct IntuiMessage *Message;
  3910.  
  3911. WORD MouseX = 0,MouseY = 0;
  3912.  
  3913. UWORD MyCode = 0;
  3914.  
  3915. LONG Error;
  3916.  
  3917. ULONG MyClass = NULL,MyMenu = NULL;
  3918.  
  3919. ULONG rxsig = arexxsignal;
  3920.  
  3921. LDouble RealCoord,ImagCoord,ScrRatio,FracRatio;
  3922.  
  3923.  PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  3924.  
  3925. // do { WaitPort (Ilbm->win->UserPort);  - replaced
  3926.  wsignal = 1 << Ilbm->win->UserPort->mp_SigBit; /* new for ARexx-support */
  3927.  
  3928. #ifndef FM_AREXX_SUPPORT  /* new for ARexx-support */
  3929.  
  3930.  do { receivedsig = Wait(wsignal);
  3931.  
  3932. #else /* FM_AREXX_SUPPORT */
  3933.  do { receivedsig = Wait (wsignal|rxsig);
  3934.  
  3935.    if (receivedsig & arexxsignal) {
  3936.       ULONG result, code;
  3937.       struct FM_ARexxEvent *act_event = NULL;
  3938.  
  3939.       result = DoMethod (ARexxObj, AM_HANDLEEVENT, &code);
  3940.       MyMenu = HandleARexxEvents (Ilbm, &Error);
  3941.       }
  3942.  
  3943. #endif /* FM_AREXX_SUPPORT */
  3944.  
  3945.    if (receivedsig & wsignal) {
  3946.       if (Message = (struct IntuiMessage *) GT_GetIMsg (Ilbm->win->UserPort))
  3947.       {
  3948.              MyClass = Message->Class;
  3949.  
  3950.              MyCode  = Message->Code;
  3951.  
  3952.              MouseX  = Message->MouseX;
  3953.  
  3954.              MouseY  = Message->MouseY;
  3955.  
  3956.              GT_ReplyIMsg ((struct IntuiMessage *) Message);
  3957.       }
  3958.  
  3959.       switch (MyClass)
  3960.       {
  3961.              case    IDCMP_MOUSEMOVE: if (TMASK & MASK)
  3962.                                       {
  3963.                                          RealCoord = RMIN + ((LDouble) MouseX * fabs (RMAX-RMIN) / (LDouble) (Ilbm->win->Width - 1));
  3964.  
  3965.                                          ImagCoord = IMAX - ((LDouble) MouseY * fabs (IMAX-IMIN) / (LDouble) (Ilbm->win->Height - 1));
  3966.  
  3967.                                          ScrRatio  = (LDouble) Ilbm->win->Width / (LDouble) Ilbm->win->Height;
  3968.  
  3969.                                          FracRatio = fabs (RMAX-RMIN) / fabs (IMAX-IMIN);
  3970.  
  3971.                                          sprintf (BAR_STRING,"Real %#+2.16f Imag %#+2.16fi W:H %.3f R:I %.3f",RealCoord,ImagCoord,ScrRatio,FracRatio);
  3972.  
  3973.                                          WaitTOF ();
  3974.  
  3975.                                          SetWindowTitles (Ilbm->win,(TEXT *) ~0,BAR_STRING);
  3976.                                       }
  3977.  
  3978.                                       break;
  3979.  
  3980.              case IDCMP_MOUSEBUTTONS: if (MyCode == SELECTDOWN) ProcessMouse (Ilbm->win,MouseX,MouseY);
  3981.  
  3982.                                       break;
  3983.  
  3984.              case     IDCMP_MENUPICK: MyMenu = ProcessMenu (Ilbm->win,MyCode);
  3985.  
  3986.                                       if (MyMenu & EXIT_MSG) break;
  3987.  
  3988.                                       if (MyMenu & SHOWGUIDE_MSG)
  3989.                                       {
  3990.                                          Execute (CATSTR(TXT_CMD_Guide),NULL,NULL);
  3991.  
  3992.                                          break;
  3993.                                       }
  3994.  
  3995.                                       if (MyMenu & TITLE_MSG)
  3996.                                       {
  3997.                                          if (TMASK & MASK) MASK &= ~TMASK;
  3998.  
  3999.                                          else MASK |= TMASK;
  4000.  
  4001.                                          Ilbm->TBState = TMASK & MASK;
  4002.  
  4003.                                          ShowTitle (Ilbm->scr,(LONG) Ilbm->TBState);
  4004.  
  4005.                                          break;
  4006.                                       }
  4007.  
  4008.                                       if (MyMenu & TIME_MSG)
  4009.                                       {
  4010.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,TRUE);
  4011.  
  4012.                                          ShowTime (Ilbm->win, CATSTR(TXT_LastCalcTime),ELAPSEDTIME);
  4013.  
  4014.                                          Delay (TWOSECS);
  4015.  
  4016.                                          if (! (TMASK & MASK)) ShowTitle (Ilbm->scr,FALSE);
  4017.  
  4018.                                          break;
  4019.                                       }
  4020.  
  4021.                                       if (MyMenu & ITER_MSG)
  4022.                                       {
  4023.                                          ModifyIDCMP (Ilbm->win,NULL);
  4024.  
  4025.                                          ClearMenuStrip (Ilbm->win);
  4026.  
  4027.                                          while (1L)
  4028.                                          {
  4029.                                             if (ResourceBase)
  4030.                                             {
  4031.                                                MAX_ITERATIONS = (UWORD) Do_IterationsRequest (Ilbm->win, FMSCREENNAME, 0, 0, MAX_ITERATIONS);
  4032.                                             }
  4033.  
  4034.                                             else
  4035.                                             {
  4036.                                                MAX_ITERATIONS = (UWORD) IntegerGad (Ilbm->win, CATSTR(TITLE_IterationsReq), CATSTR(TXT_ScrTitle_It), CATSTR(It_TXT_Iterations),MAX_ITERATIONS);
  4037.                                             }
  4038.  
  4039.                                             if (MAX_ITERATIONS >= MIN_ITERATIONS && MAX_ITERATIONS <= MAX_ALLOWED_ITERATIONS) break;
  4040.  
  4041.                                             DisplayBeep (Ilbm->scr);
  4042.                                          }
  4043.  
  4044.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4045.  
  4046.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4047.  
  4048.                                          break;
  4049.                                       }
  4050.  
  4051.                                       if (MyMenu & ABOUT_MSG)
  4052.                                       {
  4053.                                          ModifyIDCMP (Ilbm->win,NULL);
  4054.  
  4055.                                          ClearMenuStrip (Ilbm->win);
  4056.  
  4057.                                          if (ResourceBase)
  4058.                                          {
  4059.                                             Do_InfoRequest (Ilbm->win, FMSCREENNAME, 0, 0);
  4060.                                          }
  4061.  
  4062.                                          else {About (Ilbm->win);}
  4063.  
  4064.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4065.  
  4066.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4067.  
  4068.                                          break;
  4069.                                       }
  4070.  
  4071.                                       if (MyMenu & SYSINFO_MSG)
  4072.                                       {
  4073.                                          ModifyIDCMP (Ilbm->win,NULL);
  4074.  
  4075.                                          ClearMenuStrip (Ilbm->win);
  4076.  
  4077.                                          if (ResourceBase) Do_SysInfoRequest(Ilbm->win, FMSCREENNAME, 0, 0);
  4078.  
  4079.                                          else SystemInfo (Ilbm->win);
  4080.  
  4081.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4082.  
  4083.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4084.  
  4085.                                          break;
  4086.                                       }
  4087.  
  4088.                                       if (MyMenu & PALETTE_MSG)
  4089.                                       {
  4090.                                          ModifyIDCMP (Ilbm->win,NULL);
  4091.  
  4092.                                          ClearMenuStrip (Ilbm->win);
  4093.  
  4094.                                          if (ResourceBase)
  4095.                                          {
  4096.                                             res = Do_PalettePrefRequest (Ilbm->win, FMSCREENNAME, 0, 0, (struct loadrgb *) PALETTE);
  4097.                                          }
  4098.  
  4099.                                          else
  4100.                                          {
  4101.                                             res = ModifyPalette (Ilbm->win,Ilbm->win->LeftEdge + 25,Ilbm->win->TopEdge + 35,PALETTE);
  4102.                                          }
  4103.  
  4104.                                          if (! res) DisplayError (Ilbm->win, TXT_ERR_PaletteRequester, 15L);
  4105.  
  4106.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4107.  
  4108.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4109.  
  4110.                                          break;
  4111.                                       }
  4112.  
  4113.                                       if (MyMenu & CYCLERIGHT_MSG)
  4114.                                       {
  4115.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  4116.  
  4117.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  4118.  
  4119.                                          ClearMenuStrip (Ilbm->win);
  4120.  
  4121.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4122.  
  4123.                                          Cycle (Ilbm->win,DELAY,SHIFTRIGHT);
  4124.  
  4125.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4126.  
  4127.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4128.  
  4129.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  4130.  
  4131.                                          LoadRGB32 (Ilbm->vp,PALETTE);
  4132.  
  4133.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4134.  
  4135.                                          break;
  4136.                                       }
  4137.  
  4138.                                       if (MyMenu & CYCLELEFT_MSG)
  4139.                                       {
  4140.                                          ModifyIDCMP (Ilbm->win,IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY|IDCMP_MENUPICK);
  4141.  
  4142.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  4143.  
  4144.                                          ClearMenuStrip (Ilbm->win);
  4145.  
  4146.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4147.  
  4148.                                          Cycle (Ilbm->win,DELAY,SHIFTLEFT);
  4149.  
  4150.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4151.  
  4152.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4153.  
  4154.                                          if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  4155.  
  4156.                                          LoadRGB32 (Ilbm->vp,PALETTE);
  4157.  
  4158.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4159.  
  4160.                                          break;
  4161.                                       }
  4162.  
  4163.                                       if (MyMenu & DELAY_MSG)
  4164.                                       {
  4165.                                          while (1L)
  4166.                                          {
  4167.                                             if (ResourceBase)
  4168.                                             {
  4169.                                                DELAY = Do_CycleDelayRequest(Ilbm->win, FMSCREENNAME, 0, 0, DELAY);
  4170.                                             }
  4171.  
  4172.                                             else
  4173.                                             {
  4174.                                                DELAY = IntegerGad (Ilbm->win, CATSTR(TITLE_CycleDelayReq), CATSTR(TXT_ScrTitle_Cyc), CATSTR(Cyc_TXT_DelayTime),DELAY);
  4175.                                             }
  4176.  
  4177.                                             if ((DELAY >= 0L) && (DELAY <= 200)) break;
  4178.  
  4179.                                             DisplayBeep (Ilbm->scr);
  4180.                                          }
  4181.  
  4182.                                          break;
  4183.                                       }
  4184.  
  4185.                                       if (MyMenu & STOP_MSG)
  4186.                                       {
  4187.                                          SetMenuStart (Ilbm->win);
  4188.  
  4189.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4190.  
  4191.                                          break;
  4192.                                       }
  4193.  
  4194.                                       if (MyMenu & LOADPICTURE_MSG)
  4195.                                       {
  4196.                                          if (FileRequest (Ilbm->win,CATSTR(TXT_LoadPictureTitle),"FLASHMANDEL:Pictures",PICTURES_DRAWER,FALSE))
  4197.                                          {
  4198.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4199.  
  4200.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  4201.                                             {
  4202.                                                SaveCoords (Ilbm->win,TRUE);
  4203.  
  4204.                                                if (! (Error = QueryMandPic (Ilbm,&MANDChunk,MYPATH)))
  4205.                                                {
  4206.                                                   RMIN = MANDChunk.RMin;
  4207.  
  4208.                                                   RMAX = MANDChunk.RMax;
  4209.  
  4210.                                                   IMIN = MANDChunk.IMin;
  4211.  
  4212.                                                   IMAX = MANDChunk.IMax;
  4213.  
  4214.                                                   JKRE  = MANDChunk.JKre;
  4215.  
  4216.                                                   JKIM  = MANDChunk.JKim;
  4217.  
  4218.                                                   MAX_ITERATIONS = MANDChunk.Iterations;
  4219.  
  4220.                                                   Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  4221.  
  4222.                                                   CloseDisplay (Ilbm,VINFO);
  4223.  
  4224.                                                   Ilbm->IFFPFlags = IFFPF_BESTFIT;
  4225.  
  4226.                                                   COLORS = MakeDisplay (Ilbm);
  4227.  
  4228.                                                   Ilbm->IFFPFlags = NULL;
  4229.  
  4230.                                                   if (! COLORS)
  4231.                                                   {
  4232.                                                      DisplayError (Ilbm->win, TXT_ERR_MakeDisplay, 20L);
  4233.  
  4234.                                                      MyMenu = EXIT_MSG;
  4235.  
  4236.                                                      break;
  4237.                                                   }
  4238.  
  4239.                                                   MASK &= ~ZMASK;
  4240.  
  4241.                                                   COLORS -= RESERVED_PENS;
  4242.  
  4243.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  4244.  
  4245.                                                   if (LoadMandPic (Ilbm,MYPATH,TRUE)) DisplayError (Ilbm->win, TXT_ERR_LoadMandPic, 5L);
  4246.  
  4247.                                                   if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  4248.  
  4249.                                                   GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L);
  4250.  
  4251.                                                   CheckMenu (Ilbm->win);
  4252.                                                }
  4253.  
  4254.                                                else DisplayError (Ilbm->win, TXT_ERR_QueryMandPic, 0);
  4255.  
  4256.                                                FreeIFF (Ilbm->ParseInfo.iff);
  4257.                                             }
  4258.                                          }
  4259.  
  4260.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4261.  
  4262.                                          break;
  4263.                                       }
  4264.  
  4265.                                       if (MyMenu & SAVEPICTURE_MSG)
  4266.                                       {
  4267.                                          if (FileRequest (Ilbm->win, CATSTR(TXT_SavePictureTitle),"FLASHMANDEL:Pictures",PICTURES_DRAWER,TRUE))
  4268.                                          {
  4269.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4270.  
  4271.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  4272.                                             {
  4273.                                                MANDChunk.LeftEdge = Ilbm->win->LeftEdge;
  4274.  
  4275.                                                MANDChunk.TopEdge = Ilbm->win->TopEdge;
  4276.  
  4277.                                                MANDChunk.Width = Ilbm->win->Width;
  4278.  
  4279.                                                MANDChunk.Height = Ilbm->win->Height;
  4280.  
  4281.                                                MANDChunk.RMin = RMIN;
  4282.  
  4283.                                                MANDChunk.RMax = RMAX;
  4284.  
  4285.                                                MANDChunk.IMin = IMIN;
  4286.  
  4287.                                                MANDChunk.IMax = IMAX;
  4288.  
  4289.                                                MANDChunk.JKre = JKRE;
  4290.  
  4291.                                                MANDChunk.JKim = JKIM;
  4292.  
  4293.                                                MANDChunk.Iterations = MAX_ITERATIONS;
  4294.  
  4295.                                                if (ZMASK & MASK)
  4296.                                                {
  4297.                                                   DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4298.  
  4299.                                                   MASK &= ~ZMASK;
  4300.                                                }
  4301.  
  4302.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,FALSE);
  4303.  
  4304.                                                if (SaveMandPic (Ilbm,&SPECIAL_CHUNK,&USERNAME_CHUNK,MYPATH)) DisplayError (Ilbm->win, TXT_ERR_SaveMandPic, 5L);
  4305.  
  4306.                                                if (TMASK & MASK) ShowTitle (Ilbm->scr,TRUE);
  4307.  
  4308.                                                FreeIFF (Ilbm->ParseInfo.iff);
  4309.                                             }
  4310.                                          }
  4311.  
  4312.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4313.  
  4314.                                          break;
  4315.                                       }
  4316.  
  4317.                                       if (MyMenu & LOADPALETTE_MSG)
  4318.                                       {
  4319.                                          if (FileRequest (Ilbm->win,CATSTR(TXT_LoadPaletteTitle),"FLASHMANDEL:Palettes",PALETTES_DRAWER,FALSE))
  4320.                                          {
  4321.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4322.  
  4323.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  4324.                                             {
  4325.                                                if (LoadPalette (Ilbm,MYPATH,TRUE)) DisplayError (Ilbm->win, TXT_ERR_LoadMandPal, 5L);
  4326.  
  4327.                                                GetRGB32 (Ilbm->vp->ColorMap,0L,(ULONG) Ilbm->vp->ColorMap->Count,PALETTE + 1L);
  4328.  
  4329.                                                FreeIFF (Ilbm->ParseInfo.iff);
  4330.                                             }
  4331.  
  4332.                                             else DisplayError (Ilbm->win, TXT_ERR_NoMem, 5L);
  4333.  
  4334.                                          }
  4335.  
  4336.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4337.  
  4338.                                          break;
  4339.                                       }
  4340.  
  4341.                                       if (MyMenu & SAVEPALETTE_MSG)
  4342.                                       {
  4343.                                          if (FileRequest (Ilbm->win, CATSTR(TXT_SavePaletteTitle),"FLASHMANDEL:Palettes",PALETTES_DRAWER,TRUE))
  4344.                                          {
  4345.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4346.  
  4347.                                             if (Ilbm->ParseInfo.iff = AllocIFF ())
  4348.                                             {
  4349.                                                if (SavePalette (Ilbm,©RIGHT_CHUNK,MYPATH)) DisplayError(Ilbm->win, TXT_ERR_SaveMandPal, 5L);
  4350.  
  4351.                                                FreeIFF (Ilbm->ParseInfo.iff);
  4352.                                             }
  4353.  
  4354.                                             else DisplayError (Ilbm->win, TXT_ERR_NoMem, 5L);
  4355.                                         }
  4356.  
  4357.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4358.  
  4359.                                          break;
  4360.                                       }
  4361.  
  4362.                                       if (MyMenu & FONTREQ_MSG)
  4363.                                       {
  4364.                                          if (FontRequest (Ilbm->win))
  4365.                                          {
  4366.                                             if (ZMASK & MASK)
  4367.                                             {
  4368.                                                DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4369.  
  4370.                                                MASK &= ~ZMASK;
  4371.                                             }
  4372.  
  4373.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4374.  
  4375.                                             MYBITMAP = CopyBitMap (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height);
  4376.  
  4377.                                             Fade (MYILBM.win,PALETTE,25L,1L,TOBLACK);
  4378.  
  4379.                                             CloseDisplay (Ilbm,VINFO);
  4380.  
  4381.                                             if (! MakeDisplay (Ilbm))
  4382.                                             {
  4383.                                                DisplayError(Ilbm->win, TXT_ERR_MakeDisplay, 20L);
  4384.  
  4385.                                                MyMenu = EXIT_MSG;
  4386.  
  4387.                                                break;
  4388.                                             }
  4389.  
  4390.                                             PasteBitMap (MYBITMAP,Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  4391.                                          }
  4392.  
  4393.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4394.  
  4395.                                          break;
  4396.                                       }
  4397.  
  4398.                                       if (MyMenu & DUMP_MSG)
  4399.                                       {
  4400.                                          ModifyIDCMP (Ilbm->win,NULL);
  4401.  
  4402.                                          ClearMenuStrip (Ilbm->win);
  4403.  
  4404.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4405.  
  4406.                                          if (ResourceBase)
  4407.                                          {
  4408.                                             res = Do_PrintRequest(Ilbm->win, FMSCREENNAME, 0, 0);
  4409.                                          }
  4410.  
  4411.                                          else
  4412.                                          {
  4413.                                             res = Choice (Ilbm->win,CATSTR(TITLE_PrintReq),CATSTR(Prt_TXT_AreYouSure));
  4414.                                          }
  4415.  
  4416.                                          if (res)
  4417.                                          {
  4418.                                             WinDump (Ilbm->win);
  4419.                                          }
  4420.  
  4421.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4422.  
  4423.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4424.  
  4425.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4426.  
  4427.                                          break;
  4428.                                       }
  4429.  
  4430.                                       if (MyMenu & PREVIEW_MSG)
  4431.                                       {
  4432.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  4433.                                          {
  4434.                                             ModifyIDCMP (Ilbm->win,NULL);
  4435.  
  4436.                                             ClearMenuStrip (Ilbm->win);
  4437.  
  4438.                                             Preview (Ilbm->win,Ilbm->win->Width,Ilbm->win->Height);
  4439.  
  4440.                                             ResetMenuStrip (Ilbm->win,MAINMENU);
  4441.  
  4442.                                             ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4443.  
  4444.                                             RestoreCoords (Ilbm->win);
  4445.                                          }
  4446.  
  4447.                                          break;
  4448.                                       }
  4449.  
  4450.                                       if (MyMenu & COORDS_MSG)
  4451.                                       {
  4452.                                          ModifyIDCMP (Ilbm->win,NULL);
  4453.  
  4454.                                          ClearMenuStrip (Ilbm->win);
  4455.  
  4456.                                          if (ResourceBase)
  4457.                                          {
  4458.                                             res = Do_CoordinatesRequest(Ilbm->win, FMSCREENNAME, 0, 0);
  4459.                                          }
  4460.  
  4461.                                          else
  4462.                                          {
  4463.                                             res = ShowCoords (Ilbm->win);
  4464.                                          }
  4465.  
  4466.                                          if (res)
  4467.                                          {
  4468.                                             if (ResourceBase)
  4469.                                             {
  4470.                                                res = Do_RenderRequest(Ilbm->win, FMSCREENNAME, 0, 0);
  4471.                                             }
  4472.  
  4473.                                             else
  4474.                                             {
  4475.                                                res = Choice (Ilbm->win, CATSTR(TITLE_RenderReq), CATSTR(Rend_TXT_Question));
  4476.                                             }
  4477.  
  4478.                                             if (res) MyMenu |= REDRAW_MSG;
  4479.                                          }
  4480.  
  4481.                                          ResetMenuStrip (Ilbm->win,MAINMENU);
  4482.  
  4483.                                          ModifyIDCMP (Ilbm->win,IDCMP_STANDARD);
  4484.                                       }
  4485.  
  4486.                                       if (MyMenu & UNDO_MSG) RestoreCoords (Ilbm->win);
  4487.  
  4488.                                       if (MyMenu & REDRAW_MSG)
  4489.                                       {
  4490.                                          if (ZMASK & MASK)
  4491.                                          {
  4492.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4493.  
  4494.                                             MASK &= ~ZMASK;
  4495.                                          }
  4496.  
  4497.                                          SetMenuStop (Ilbm->win);
  4498.  
  4499.                                          PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4500.  
  4501.                                          ELAPSEDTIME = DrawFractal (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height,TRUE);
  4502.  
  4503.                                          PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4504.  
  4505.                                          SetMenuStart (Ilbm->win);
  4506.  
  4507.                                          ShowTime (Ilbm->win,CATSTR(TXT_RecalculateTime),ELAPSEDTIME);
  4508.  
  4509.                                          break;
  4510.                                       }
  4511.  
  4512.                                       if (MyMenu & DRAW_MSG)
  4513.                                       {
  4514.                                          if (ZMASK & MASK)
  4515.                                          {
  4516.                                             DrawBorder (Ilbm->wrp,&MYBORDER,0,0);
  4517.  
  4518.                                             MASK &= ~ZMASK;
  4519.                                          }
  4520.  
  4521.                                          if (NewCoords (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4],ZOOMLINE [5]))
  4522.                                          {
  4523.                                             MYBITMAP = CopyBitMap (Ilbm->win,ZOOMLINE [6],ZOOMLINE [3],ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  4524.  
  4525.                                             PasteBitMap (MYBITMAP,Ilbm->win,ZOOMLINE [4]-ZOOMLINE [6]+1,ZOOMLINE [5]-ZOOMLINE [3]+1);
  4526.  
  4527.                                             SetMenuStop (Ilbm->win);
  4528.  
  4529.                                             PutPointer (Ilbm->win,0,0,0,0,0,BUSY_POINTER);
  4530.  
  4531.                                             ELAPSEDTIME = DrawFractal (Ilbm->win,Ilbm->win->LeftEdge,Ilbm->win->TopEdge,Ilbm->win->Width,Ilbm->win->Height,TRUE);
  4532.  
  4533.                                             PutPointer (Ilbm->win,ZoomPointer,ZPW,ZPH,ZPXO,ZPYO,ZOOM_POINTER);
  4534.  
  4535.                                             SetMenuStart (Ilbm->win);
  4536.  
  4537.                                             ShowTime (Ilbm->win, CATSTR(TXT_ZoomTime),ELAPSEDTIME);
  4538.                                          }
  4539.  
  4540.                                          break;
  4541.                                       }
  4542.  
  4543.                                       if (MyMenu & AREXX_MSG)
  4544.                                       {
  4545.                                          HandleARexxMenu (Ilbm, MyCode);
  4546.  
  4547.                                          break;
  4548.                                       }
  4549.  
  4550.                                       break;
  4551.  
  4552.              case       IDCMP_RAWKEY: if (MyCode == RAW_ESC) MyMenu = EXIT_MSG;
  4553.  
  4554.                                       if (MyCode == HELP) Execute (CATSTR(TXT_CMD_Guide),NULL,NULL);
  4555.  
  4556.                                       break;
  4557.  
  4558.              case  IDCMP_CLOSEWINDOW: MyMenu = EXIT_MSG;
  4559.       }
  4560.  
  4561.      }  /* new for ARexx-support */
  4562.  
  4563.     MyClass = 0;
  4564.  
  4565.     } while (! ((MyMenu & EXIT_MSG) || (MyMenu & NEWDISPLAY_MSG)));
  4566.  
  4567.  return MyMenu;
  4568. }
  4569.  
  4570. void FreeBitMapSafety (struct BitMap *Bitmap)
  4571. {
  4572.     WaitBlit ();
  4573.  
  4574.     FreeBitMap (Bitmap);
  4575. }
  4576.  
  4577. struct BitMap *CopyBitMap (struct Window *Win,WORD Left,WORD Top,WORD Width,WORD Height)
  4578. {
  4579. struct BitMap *NewBM;
  4580.  
  4581.   NewBM = AllocBitMap ((ULONG) Width,(ULONG) Height,(ULONG) Win->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES,Win->RPort->BitMap);
  4582.  
  4583.   if (NewBM)
  4584.   {
  4585.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  4586.  
  4587.      if (TMASK & MASK) ShowTitle (Win->WScreen,FALSE);
  4588.  
  4589.      BltBitMap (Win->RPort->BitMap,Left,Top,NewBM,0,0,Width,Height,0xC0,0xFF,NULL);
  4590.  
  4591.      if (TMASK & MASK) ShowTitle (Win->WScreen,TRUE);
  4592.  
  4593.      if (ZMASK & MASK) DrawBorder (Win->RPort,&MYBORDER,0,0);
  4594.  
  4595.      MASK |= BMASK;
  4596.   }
  4597.  
  4598.   return NewBM;
  4599. }
  4600.  
  4601. BOOL PasteBitMap (struct BitMap *SrcBM,struct Window *DstWin,WORD SrcWidth,WORD SrcHeight)
  4602. {
  4603. BOOL Success = FALSE;
  4604.  
  4605. UWORD DstWinWidth,DstWinHeight;
  4606.  
  4607. struct BitMap *TmpBM;
  4608.  
  4609.   if (SrcBM && (MASK & BMASK))
  4610.   {
  4611.      DstWinWidth = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZWidth : DstWin->Width);
  4612.  
  4613.      DstWinHeight = ((DstWin->Flags & WFLG_GIMMEZEROZERO) ? DstWin->GZZHeight : DstWin->Height);
  4614.  
  4615.      TmpBM = AllocBitMap ((ULONG) DstWinWidth,(ULONG) DstWinHeight,(ULONG) DstWin->RPort->BitMap->Depth,BMF_INTERLEAVED | BMF_MINPLANES | BMF_CLEAR,DstWin->RPort->BitMap);
  4616.  
  4617.      if (TmpBM)
  4618.      {
  4619.         BSA.bsa_SrcWidth    = SrcWidth;
  4620.         BSA.bsa_SrcHeight   = SrcHeight;
  4621.         BSA.bsa_XSrcFactor  = SrcWidth;
  4622.         BSA.bsa_YSrcFactor  = SrcHeight;
  4623.         BSA.bsa_XDestFactor = DstWinWidth;
  4624.         BSA.bsa_YDestFactor = DstWinHeight;
  4625.         BSA.bsa_SrcBitMap   = SrcBM;
  4626.         BSA.bsa_DestBitMap  = TmpBM;
  4627.  
  4628.         BitMapScale (&BSA);
  4629.  
  4630.         BltBitMapRastPort (TmpBM,0,0,DstWin->RPort,0,0,DstWinWidth,DstWinHeight,0xC0);
  4631.  
  4632.         FreeBitMapSafety (TmpBM);
  4633.  
  4634.         Success = TRUE;
  4635.      }
  4636.  
  4637.      FreeBitMapSafety (SrcBM);
  4638.  
  4639.      MASK &= ~BMASK;
  4640.   }
  4641.  
  4642.   return Success;
  4643. }
  4644.  
  4645. LONG WinDump (struct Window *Win)
  4646. {
  4647. struct IODRPReq *IODrp;
  4648. struct MsgPort  *PrinterPort;
  4649. struct ViewPort *Vp;
  4650.  
  4651. LONG Error = PDERR_BADDIMENSION;
  4652.  
  4653.   if (! Win) return Error;
  4654.  
  4655.   if (PrinterPort = CreatePort (0,0))
  4656.   {
  4657.      if (IODrp = (struct IODRPReq *) CreateExtIO (PrinterPort,sizeof (struct IODRPReq)))
  4658.      {
  4659.         if (! (Error = OpenDevice (PRINTERDEVICE,0,(struct IORequest *) IODrp,0)))
  4660.         {
  4661.            Vp = ViewPortAddress (Win);
  4662.  
  4663.            IODrp->io_Command   = PRD_DUMPRPORT;
  4664.            IODrp->io_RastPort  = Win->RPort;
  4665.            IODrp->io_ColorMap  = Vp->ColorMap;
  4666.            IODrp->io_Modes     = GetVPModeID (Vp);
  4667.            IODrp->io_SrcX      = Win->LeftEdge;
  4668.            IODrp->io_SrcY      = Win->TopEdge;
  4669.            IODrp->io_SrcWidth  = Win->Width;
  4670.            IODrp->io_SrcHeight = Win->Height;
  4671. //           IODrp->io_DestCols  = 0;
  4672. //           IODrp->io_DestRows  = 0;
  4673.            IODrp->io_Special   = SPECIAL_ASPECT | SPECIAL_TRUSTME | SPECIAL_CENTER;
  4674.  
  4675.            Error = DoIO ((struct IORequest *)IODrp);
  4676.  
  4677.            CloseDevice ((struct IORequest *)IODrp);
  4678.         }
  4679.  
  4680.         DeleteExtIO ((struct IORequest *)IODrp);
  4681.      }
  4682.  
  4683.      DeletePort (PrinterPort);
  4684.   }
  4685.  
  4686.   return Error;
  4687. }
  4688.